这与使用Queue和QueueWorkers的laravel 5.3,beanstalk,ttr和timeout有关。 TTR:https://github.com/kr/beanstalkd/wiki/faq

如果我正确理解,当QueueWorker进行选择时,队列中的作业将获得保留状态。当ttr用完时,该作业状态将变回就绪状态。但是QueueWorker会发生什么?

假设通过以下命令将QueueWorker的超时设置为600:

php artisan queue:work --tries=1 --timeout=600 --sleep=0

默认情况下,ttr设置为60秒。

在工作期间,向另一个站点发出了一个请求,并且需要120秒才能做出响应。 60秒后,由于TTR,作业被重新设置为就绪状态。 QueueWorker是否会继续工作直到收到响应(最长600秒)?还是在达到TTR时QueueWorker会停止工作?

最佳答案

实际上,QueueWorker将一直运行到作业完成为止。当您运行没有守护程序标志的队列工作器时,它将运行以下代码:

return $this->worker->pop(
    $connection, $queue, $delay,
    $this->option('sleep'), $this->option('tries')
);

引用:
https://github.com/laravel/framework/blob/5.2/src/Illuminate/Queue/Console/WorkCommand.php#L123

该代码的作用是从队列中弹出其作业,并以命令的方式触发该作业:
public function process($connection, Job $job, $maxTries = 0, $delay = 0)
{
    if ($maxTries > 0 && $job->attempts() > $maxTries) {
        return $this->logFailedJob($connection, $job);
    }

    try {
        $job->fire();

        $this->raiseAfterJobEvent($connection, $job);

        return ['job' => $job, 'failed' => false];
    } catch (Exception $e) {
        if (! $job->isDeleted()) {
            $job->release($delay);
        }

        throw $e;
    } catch (Throwable $e) {
        if (! $job->isDeleted()) {
            $job->release($delay);
        }

        throw $e;
    }
}

引用:
https://github.com/laravel/framework/blob/5.2/src/Illuminate/Queue/Worker.php#L213

挖掘源以获取更多信息:
https://github.com/laravel/framework/tree/5.2/src/Illuminate/Queue

关于laravel - TTR用尽​​时,QueueWorker会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41261770/

10-10 20:19