首页 > 解决方案 > 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 文档的建议配置。

标签: laraveljobslaravel-6

解决方案


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需要设置为更高的值,所以它可以重试。

希望这可以帮助。


推荐阅读