我在使用自定義 laravel 隊列連接/隊列時遇到了一些問題。這個特定的連接/隊列用于可能需要 5 分鐘到 10 小時的作業(大型數據聚合和數據重建)我有一個主管 conf 定義為[program:laravel-worker-extended]process_name=%(program_name)s_%(process_num)02dcommand=php /var/www/artisan queue:work --queue=refreshQueue,rebuildQueue --sleep=3 --timeout=86400 --tries=2 --delay=360autostart=trueautorestart=trueuser=rootnumprocs=4redirect_stderr=truestdout_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我在服務提供者中添加了進一步調試以偵聽隊列完成事件。
2 回答

ABOUTYOU
TA貢獻1812條經驗 獲得超5個贊
我已經弄清楚了這里的問題。在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
不是隊列本身。
這是關于連接與隊列差異的寶貴經驗。
- 2 回答
- 0 關注
- 327 瀏覽
添加回答
舉報
0/150
提交
取消