第一次更新,完成了初版调整
This commit is contained in:
@@ -44,19 +44,21 @@ class QueueService
|
||||
|
||||
/**
|
||||
* 检查延迟队列,将到期任务迁移到普通队列
|
||||
* 并发安全:先 zrem,只有「移除成功(返回>0)」的进程才把任务放进就绪队列,
|
||||
* 避免多个消费者同时迁移导致同一任务被投递多次。
|
||||
* @param string $queueName
|
||||
*/
|
||||
public function migrateDelayedToReady($queueName)
|
||||
{
|
||||
$now = time();
|
||||
// 获取到期任务
|
||||
$tasks = $this->redis->zrangebyscore($queueName . ':delayed', 0, $now);
|
||||
if (!empty($tasks)) {
|
||||
foreach ($tasks as $task) {
|
||||
// 放回普通队列
|
||||
if (empty($tasks)) {
|
||||
return;
|
||||
}
|
||||
foreach ($tasks as $task) {
|
||||
// 先抢占式移除,再入队
|
||||
if ($this->redis->zrem($queueName . ':delayed', $task) > 0) {
|
||||
$this->push($queueName, $task);
|
||||
// 从延迟队列中移除
|
||||
$this->redis->zrem($queueName . ':delayed', $task);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user