为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel 异常队列最大尝试次数超出

Laravel 异常队列最大尝试次数超出

PHP
MMTTMM 2023-08-06 15:00:06
我创建了一个应用程序来向多个用户发送电子邮件,但在处理大量收件人时遇到问题。错误出现在failed_jobs表格中Illuminate\Queue\MaxAttemptsExceededException: App\Jobs\ESender has been attempted too many times or run too long. The job may have previously timed out. in D:\EmailSender\vendor\laravel\framework\src\Illuminate\Queue\Worker.php:649这是payload在failed_jobs表中{"uuid":"ff988083-c1da-4d20-a2e3-c2a10e154c79","timeout":9000,"id":"j2Lz0Ro0bkJpqwxKWTxC3Tiii71iE6Cm","data":{"command":"O:16:\"App\\Jobs\\ESender\":13:{s:7:\"timeout\";i:9000;s:12:\"receiver_obj\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":4:{s:5:\"class\";s:12:\"App\\Receiver\";s:2:\"id\";i:6;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";}s:16:\"sender_all_hosts\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":4:{s:5:\"class\";s:15:\"App\\SenderHosts\";s:2:\"id\";a:4:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;}s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";}s:11:\"message_obj\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":4:{s:5:\"class\";s:12:\"App\\Messages\";s:2:\"id\";i:36;s:9:\"relations\";a:0:{}s:10:\"connection\";s:5:\"mysql\";}s:7:\"counter\";i:1;s:3:\"job\";N;s:10:\"connection\";N;s:5:\"queue\";N;s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:5:\"delay\";N;s:10:\"middleware\";a:0:{}s:7:\"chained\";a:0:{}}","commandName":"App\\Jobs\\ESender"},"displayName":"App\\Jobs\\ESender","timeoutAt":1594841911,"maxExceptions":null,"maxTries":null,"job":"Illuminate\\Queue\\CallQueuedHandler@call","delay":null,"attempts":1}
查看完整描述

4 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

您在作业中设置了 a timeout,但此超时大于retry_after您在此配置中定义的值。

有一个明确的警告:

--timeout 值应始终比 retry_after 配置值至少短几秒。这将确保处理给定作业的工作人员始终在重试作业之前被终止。如果您的 --timeout 选项比您的 retry_after 配置值长,您的作业可能会被处理两次。

您可以为长时间运行的作业定义一个新连接,并在作业上设置此连接(分派到特定连接),而不是使用timeout.


查看完整回答
反对 回复 2023-08-06
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

如果需要就增加超时时间即可,但注意不要长时间占用服务器资源

php artisan queue:work --timeout=10000000


查看完整回答
反对 回复 2023-08-06
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

运行队列工作程序的命令需要 --tries= 和 --timeout= 来设置队列工作程序允许的输出限制。

这可以确保您的命令不会超出您定义的工作人员的限制。

您可以使用作业属性来实现超时或尝试,如下所示。并使用队列配置文件设置默认值。


查看完整回答
反对 回复 2023-08-06
?
白板的微信

TA贡献1883条经验 获得超3个赞

跑步

php artisan config:clear
php artisan optimization:clear

重启主管


查看完整回答
反对 回复 2023-08-06
  • 4 回答
  • 0 关注
  • 812 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信