当 TTR 运行 结束时 QueueWorker 会发生什么?

What happens with the QueueWorker when TTR ran out?

这涉及 laravel 5.3、beanstalk、ttr 和与 Queue 和 QueueWorkers 一起工作的超时。 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 会 运行 直到作业完成。当你 运行 queue worker 没有守护进程标志时,它将 运行 下面的代码:

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