所有工作完成后轮询Laravel队列

时间:2016-12-19 18:25:28

标签: php laravel queue

是否有任何最佳实践可以确定作业/工作人员何时完成Laravel队列的处理?我能想到的唯一方法是轮询jobs表,以查看队列中何时没有其他作业。

我面临的挑战是,我会定期向队列发送1,000个作业,然后一段时间再发送1000个作业,然后再发送另一个作业。如果可能的话,我希望能够在每批作业完成后触发事件。

感谢您提出任何建议或指示。

2 个答案:

答案 0 :(得分:1)

不,没有这样的功能。但是,通过侦听Illuminate\Queue\Events\Looping事件(在Laravel 5.4之前为illuminate.queue.looping)并检查队列大小来实现它很简单。

<?php

use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Queue\Events\Looping;

class QueueSizeCheckerAndEventThingieSubscriber {

    public function subscribe(Dispatcher $events) {
        $events->listen(Looping::class, self::class . '@onQueueLoop'); // >= 5.4
        $events->listen('illuminate.queue.looping', self::class . '@onQueueLoop'); // < 5.4
    }

    public function onQueueLoop() {
        $queueName = 'my-queue';
        $queueSize = Queue::size($queueName);

        if ($queueSize === 0) {
            // Trigger your event.
        }
    }

}

答案 1 :(得分:0)

我认为preventOverlapping最适合您的需要。

https://laravel.com/docs/5.3/scheduling#preventing-task-overlaps

我已经在使用beanstalkd和supervisor运行正常的作业了。直到

才出现问题