我在使用自定义 laravel 队列连接/队列时遇到了一些问题。这个特定的连接/队列用于可能需要 5 分钟到 10 小时的作业(大型数据聚合和数据重建)
我有一个主管 conf 定义为
[program:laravel-worker-extended]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/artisan queue:work --queue=refreshQueue,rebuildQueue --sleep=3 --timeout=86400 --tries=2 --delay=360
autostart=true
autorestart=true
user=root
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/storage/logs/queue-worker.log
我有一个队列连接定义为:
'refreshQueue' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'refreshQueue',
'retry_after' => 420, // Retry after 7 minutes
],
我通过以下命令使用命令将作业添加到队列中:
AggregateData::dispatch()->onConnection('refreshQueue')->onQueue('refreshQueue');
构造 DatabaseQueue 时,retryAfter 定义为 420。但是这是我的工作日志:
[2020-01-22 18:25:37] local.INFO: BEGINNING AGGREGATION
[2020-01-22 18:25:37] local.INFO: Aggregating data
[2020-01-22 18:27:08] local.INFO: BEGINNING AGGREGATION
[2020-01-22 18:27:08] local.ALERT: AGGREGATION FAILED: Aggregation in progress
为什么当我明确告诉它在 420 之后重试时,它会在 90 秒后继续重试?
我已经重建了我的容器,重新启动了队列,并完成了我可以调试的所有其他事情......然后等待一段时间,我得到了最终的日志输出:
[2020-01-22 18:25:37] local.INFO: BEGINNING AGGREGATION
[2020-01-22 18:25:37] local.INFO: Aggregating data
[2020-01-22 18:27:08] local.INFO: BEGINNING AGGREGATION
[2020-01-22 18:27:08] local.ALERT: AGGREGATION FAILED: Aggregation in progress
[2020-01-22 18:33:04] local.INFO: [COMPLETE] Aggregating data
[2020-01-22 18:33:04] local.INFO: Queue job finishedIlluminate\Queue\CallQueuedHandler@call
我不太明白为什么队列在 90 秒后继续重试作业。我在这里做错了吗?
在此处编辑一些其他上下文:
此方法in_progress在开始时设置一个标志,因此它不能在同一时间运行两次。日志可以解释为:
BEGINNING AGGREGATIONhandle():工作方法的第一行
AGGREGATION FAILED: Aggregation in progress:failed()作业的方法通过异常处理失败。这一行表明它再次尝试了该作业,并且遇到了设置为1已经表示另一个作业正在处理的标志。当作业完成或遇到不同的异常(不是“进行中”)时,此标志将重置为 0。
Queue job finishedIlluminate\Queue\CallQueuedHandler@call我在服务提供者中添加了进一步调试以侦听队列完成事件。
森林海
ABOUTYOU