我正试图用Laravel设置一个IronMq队列,我已经让它工作了,但关键是行为不是想要的。
我希望IronMq等到一个作业完成($job->delete())来推送一个新的,但是我发现它在前一个完成之前推送消息。
代码结构如下:
Route::post('queue/send' ,function()
{
...
Queue::push(function($job) use ($data)
{
...
$job->delete();
}
return true;
}
是否有人发现了防止并行行为并使其顺序的方法?
非常感谢!
推送队列自然会继续推送消息,不管任务是否完成,因为它们是两个独立的系统。其次,使用推送队列的目的是使其尽可能实时。
IronMQ特别具有重试功能,它将在指定的时间间隔(您设置)内重试将消息推送到所需的端点X次(您设置)—希望这将有助于解决您的问题。
如果您希望一个作业只在前一个作业完成后才被处理,并且稍微延迟是可以接受的,那么我建议轮询队列并分批检索。
你也可以尝试使用IronMQ类代替laravel Queue类:
$ironmq = new IronMQ(array(
'token' => Config::get('queue.connections.iron.token', 'xxx'),
'project_id' => Config::get('queue.connections.iron.project', 'xxx')
));
$ironmq->postMessage($queue_name, "Hello world");
感谢您的回答,我决定使用beanstald而不是IronMQ。
它要混乱得多,但它提供了所需的功能,我不依赖任何人。