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 (служба очереди сообщений) автоматически удаляет задание после его извлечения из очереди.