laravel - Laravel Job:如何确保单个作业的超时时间很长?
问题描述
我的 webapp 有大量的工作,除了一个之外,所有的工作都运行良好。
我需要这个特殊的工作能够存活很长时间,一个小时,3600 秒,如果随着时间的推移会失败,并且不要重试。
我试图在我的工作中设置这个属性
public $timeout = 3600;
public $retryAfter = 4000;
public $tries = 1;
我知道在失败后这个特殊的工作永远不会重试,没关系。
但是 timeout 和/或 retryAfter 被忽略。几分钟后,该作业被标记为失败。
我究竟做错了什么?另外,请问 timeout 和 retryAftrer 有什么区别?!?
有关我的上下文的更多信息
我的队列由主管管理如下:
[program:projectname-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/appdemo.projectname.com/artisan queue:work redis --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/appdemo.projectname.com/storage/logs/laravel_worker.log
这是根据 Lararavel 文档的建议配置。
解决方案
public $timeout = 3600
仅当您使用 运行队列时才有效queue:work
,但如果使用queue:listen
.
此外,在worker
级别上,您有--timeout
参数可以在工作人员级别上指定超时,而不仅仅是在工作级别上,就像这样php artisan queue:work --timeout=3600
。
但是,您绝对应该考虑为耗时的作业设置一个单独的队列,以便该作业应该在另一个队列中排队,但所有其他不耗时的作业都可以在一个队列上运行。
https://laravel.com/docs/7.x/queues#customizing-the-queue-and-connection
此外,timeout
定义该作业应该运行多长时间,并retryAfter
指定它应该在多长时间后再次尝试运行它。当然tries
需要设置为更高的值,所以它可以重试。
希望这可以帮助。
推荐阅读
- apache - Centos8、Phpmyadmin、网关超时、导入文件
- c# - 在启用可空的 c# 环境中仍然使用 NotNull 属性是否有用?还是那没有区别?
- python - Keras:从鉴别器手动反向传播到生成器
- c++ - ICU::UnicodeString 找到 indexOf 一个代码点,而不是一个代码单元
- android - 如何在蓝牙 java android 上录制时强制音频播放到耳机?
- regex - 使用 perl 替换配置文件中的字符串
- php - CodeIgniter,未找到请求的页面
- excel - PasteSpecial 和 xlPasteValues
- swift - 我可以在 Mac 应用程序中轻松识别 MIDI 音符吗?
- python - 使用Python从Excel中的2个文件计算距离