Mmy*_*low 5 queue beanstalkd laravel laravel-5 laravel-5.3
这与使用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
Run Code Online (Sandbox Code Playgroud)
默认情况下,ttr设置为60秒.
在工作期间,请求到另一个站点,并且需要120秒直到响应.60秒后,由于TTR,作业将重新设置为就绪状态.QueueWorker是否会继续工作直到收到响应,最多600秒?或者,当TTR到达时,QueueWorker是否会停止工作?
小智 4
实际上,QueueWorker 将运行直到作业完成。当您在没有守护进程标志的情况下运行队列工作程序时,它将运行以下代码:
return $this->worker->pop(
$connection, $queue, $delay,
$this->option('sleep'), $this->option('tries')
);
Run Code Online (Sandbox Code Playgroud)
参考: 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;
}
}
Run Code Online (Sandbox Code Playgroud)
参考: 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