使用 Artisan::queue 将命令放到队列内执行,在任务执行前,如何从队列中先删除此任务?

先说想要问的问题:使用Artisan::queue队列的command,如何在command执行之前,先在队列内删除此条记录,避免任务超时,队列重复执行的情况?

下面是问题背景。。。

之前开发的时候图方便,所有的邮件发送操作均是使用
php artisan send:mail test@test.com --content_id=1
这种方式来做的。

后面直接使用 Artisan::queue() ,将命令放到队列内来实现多进程发送。使用redis作为数据库。
起初一开始非常好,速度也很正常,但是基本上6-8个小时左右,就会出现任务缓慢、直至失败。
有时还会给之前队列的邮件地址发送邮件。

昨天晚上查了一些资料,有说laravel队列默认执行等待时间是60秒,如果未执行完毕就重新放入队列,但我也依照资料写的内容,修改了expire的时间,甚至我怕不够久,还设置成了非常大的数字。
retry_after 跟 expire 均设置成 60x60x24x7。

资料:博客:使用 Laravel Queue 不得不明白的知识

早上4点多修改完成之后,运行到今天下午3点都比较正常,但是3点之后就速度变慢,然后基本上等于暂停了。同时还给之前队列到的邮件地址发送了邮件。。。。。

我horizon.php 里面,就设置了timeout 为60x60。

这个问题出现很久了,尝试了很多种办法来处理,但是始终不知道怎么解决。。如果说需要把command写成job再重新写一遍代码,那就太痛苦了。。。。

所以想请教一下,有没有人知道 使用Artisan::queue队列的command,如何在command执行之前,先在队列内删除此条记录?

QQ76762
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
QQ76762
最佳答案

解决了。。。

原来不能将tries设置为0,设置为0就是无限重试直到成功。。。

horizon.php 中
'tires' => 1,
'timeout' => 60x30,
queue.php 中
'retry_after' 设置为大于 timeout 的值乘以 tires 的值,就不会出现重复跑了。

惨痛的教训,160多台机器空跑了一周。。

6年前 评论
讨论数量: 1
QQ76762

解决了。。。

原来不能将tries设置为0,设置为0就是无限重试直到成功。。。

horizon.php 中
'tires' => 1,
'timeout' => 60x30,
queue.php 中
'retry_after' 设置为大于 timeout 的值乘以 tires 的值,就不会出现重复跑了。

惨痛的教训,160多台机器空跑了一周。。

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!