Laravel 自定义队列不尊重 retry_after

我在使用自定义 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我在服务提供者中添加了进一步调试以侦听队列完成事件。


桃花长相依
浏览 294回答 2
2回答

森林海

这可能与您正在使用的时间超时有关。从文档:--timeout 值应始终比您的 retry_after 配置值短几秒钟。这将确保处理给定作业的工作人员总是在重试作业之前被杀死。如果您的 --timeout 选项比您的 retry_after 配置值长,您的作业可能会被处理两次。

ABOUTYOU

我已经弄清楚了这里的问题。在queue.php我定义一个连接 refreshQueue。但是,在我的主管 conf 中,我使用的是:command=php /var/www/artisan queue:work --queue=refreshQueue,rebuildQueue --sleep=3 --timeout=86400 --tries=2 --delay=360作为命令 ( --queue),命令应该是:command=php /var/www/artisan queue:work refreshQueue --sleep=3 --timeout=86400 --tries=2 --delay=360注意缺少--queue. 连接有定义,而retry_after不是队列本身。这是关于连接与队列差异的宝贵经验。
打开App,查看更多内容
随时随地看视频慕课网APP