【发布时间】:2014-09-26 06:12:19
【问题描述】:
这是场景,我正在使用 Beanstalkd 队列将电子邮件发送到大量电子邮件(50000+),每封电子邮件都必须有一些独特的内容,因此被解雇的作业会遍历所有地址,生成内容并发送邮件。
有时用户可能想在发送过程中取消操作,例如,在作业运行期间,邮件发送到 20000 个地址后,用户单击“停止”,这应该“删除”工作。
到目前为止,我所做的是我设法获得了正在运行的作业实例,Queue::Push 返回作业 ID,因此我将这个 ID 保存在 DB 中,当我想停止作业时,这就是我所做的试着做
$phean= Queue::getPheanstalk();
$res = $phean->peek($Job_ID); // returns a Pheanstalk_Job
$job = new \Illuminate\Queue\Jobs\BeanstalkdJob(app() , $phean, $res , 'default') ;
$res = $job->delete() // returns NOT_FOUND ??
$data = $job->getRawBody() // returns correct data, so I'm sure this is the right job instance
那么为什么我会得到 NOT_FOUND,虽然当我使用 supervisorctl tail -f 队列名 我可以看到作业仍在运行并输出内容
有什么帮助吗?如果有比尝试获取工作并以这种方式删除它更好的方法我愿意接受建议,我考虑将工作 ID 保存在数据库中(ID、状态),当我想删除它时,我会更改 ID状态,并且在作业中运行的循环中,它每次检查一次,或者可能每 10 次检查一次,如果状态等于 1,例如然后 $job->delete(),但这会很慢将在每个循环中命中数据库。
【问题讨论】:
-
您的最后一个选项听起来不错,但我会使用缓存而不是数据库。并检查每 100 次左右的迭代。
标签: php email laravel supervisord beanstalkd