我的网络应用程序有很多工作,都运行良好,一个很好。
我需要这项特殊工作才能长时间,一个小时,3600秒生存下来,并且如果超时就会失败,并且不要重试。
我尝试在我的工作中设置此属性
public $timeout = 3600;
public $retryAfter = 4000;
public $tries = 1;
我获得了失败后,该特定任务从未被重试过,没关系。
但是超时和/或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
需要设置为更高的值,因此可以重试。
希望这会有所帮助。
长期运行的工作可能与导致其早期失败的几个因素有关:
查看其中每一个,看看您的瓶颈可能在哪里。请记住,设置因服务器而异。