laravel5.1redis队列重复执行问题

来源:互联网 发布:策略模式 java的概念 编辑:程序博客网 时间:2024/06/07 02:36

按照官方邮件发送配置完后,将任务添加到队列中,
$job = (new SendReminder($withdrawal))->onQueue('emails')->delay(10);
$this->dispatch($job);
然后服务端启动队列监听,
php artisan queue:listen --queue=emails
却发现任务一直执行,也就是一直会收到邮件。


按理说,生产者将任务加入队列,消费者从队列中取任务消费,应该是先进先出,只执行一次才对呀,可是为什么会一直执行?

安装上redisadmin后查看,发现添加的任务一直保留在队列中,没有被取走(删除)。并且这条任务的状态变为了reserved(保留的)。

然后在网上发现了这篇文章(http://yansu.org/2014/04/11/redis-queue-in-laravel.html),它讲了laravel使用redis作为队列系统的执行流程。
其中讲了什么情况下任务的状态会变为reserved。


像我这种发送通知的任务,正好可以用到。只发送一次(有可能失败,准确性要求不是很高),在handle方法开始加上
$this->job->delete();后,任务就只会最多执行一次了。


最后总结一下怎样才能尽快的发现问题和解决问题:
第一,要从不同的角度(或者眼光)看待同一个问题,就像盲人摸象一样,你可能看到的只是一条腿,只有你接触了耳朵、鼻子...,才能认识真正的问题是什么;这里面是指不要在同一个方向上面纠结,有时候换个角度验证可以更早地发现真正的问题所在;
第二,工具的使用,专业的工具相比(蹩脚的工具),可能会使你发现问题和解决问题的能力提高10倍;在这个问题里面是指redisadmin和redis命令行;

2 0