项目的队列使用database 作为队列驱动,在任务入队之后发现并未生效。所以对问题进行排查。
- 首先查看 failed_jobs 表,发现并没有失败的任务生成记录,然后查看jobs 表,发现确实已经入了 jobs 表的记录。 查看项目日志,如下
Numeric value out of range: 1264 Out of range value for column 'attempts' at row 1
(SQL: update `yn_jobs` set `reserved_at` = 1585808364, `attempts` = 256 where `id` = 1331)
in /usr/local/nginx/html/yinuo-crm-api/vendor/illuminate/database/Connection.php:664
发现是由于尝试次数引起的,查看对应id 的数据库记录,查看payload 字段,
代码语言:javascript复制{"displayName":"App\Jobs\OrderMark","job":"Illuminate\Queue\CallQueuedHandler@call","maxTries":null,"timeout":null,"data":{"commandName":"App\Jobs\OrderMark","command":"O:18:"App\Jobs\OrderMark":5:{s:10:"u0000*u0000orderid";i:13658;s:6:"u0000*u0000job";N;s:10:"connection";N;s:5:"queue";N;s:5:"delay";i:21820635;}"}}
发现maxTries 和timeout 字段都是null,这个时候该任务会无限期执行,导致队列堵塞。 找到问题,进行解决,在对应的job 文件下添加最大尝试次数的参数
代码语言:javascript复制class DataMark extends Job {
public $tries = 5; //添加最大尝试次数
.....
public function __construct($datas){
.......
}
public function handle(){
.......
return true;
}
}
最后删掉那条一直在重试的任务,新入队的任务都有重试次数的限制了,不会出现一直重试导致拥堵的情况啦。