Laravel - Задача очереди вставки с пользовательским методом обработки и удалением задания.

Рассмотрим код такого типа, который помещает задачу в очередь для запуска пользовательского метода-обработчика, расположенного в том же классе:

<?php namespace Space;

class Spaceship {

    public static function cruise()
    {
        // Throtting in 3 seconds...
        Queue::later(3, '\Space\Spaceship@throttle', $coordinates, 'queue-name');
    }

    public static function throttle($job, $data)
    {
        $job->delete();
        return 'ok';
    }

}

Это работало нормально, прежде чем я добавил $job->delete(); но теперь это дает ошибку:

exception 'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Call to a member function delete() on a non-object

В документах Laravel 4.2 нет объяснения, почему при задании задачи push-очереди, указывающей на пользовательский метод-обработчик, вам не нужно явно удалять задачу из очереди с помощью $job->delete()? Тем не менее, такая реализация работает, и когда регистрируется параметр $ job, он ложен.

1 ответ

Решение

Идти к app\config\queue.php и проверить default ключ. Если последний установлен на sync, то ожидаемое выше поведение ожидается.

sync водитель немедленно запускает вашу задачу, а это значит, Queue::later на самом деле Queue::push,

Попробуйте конвертировать ваши Queue::later в Queue::push и код будет работать без ошибок.

Что касается явного удаления задачи в очереди, то это по большей части не нужно. Однако вы должны учитывать службы очереди, которые не обеспечивают автоматическое удаление задания.

С моей стороны, AWS SQS (служба очереди сообщений) автоматически удаляет задание после его извлечения из очереди.

Другие вопросы по тегам