Рассмотрим код такого типа, который помещает задачу в очередь для запуска пользовательского метода-обработчика, расположенного в том же классе:
<?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, он ложен.
Идти к app\config\queue.php
и проверить default
ключ. Если последний установлен на sync
, то ожидаемое выше поведение ожидается.
sync
водитель немедленно запускает вашу задачу, а это значит, Queue::later
на самом деле Queue::push
,
Попробуйте конвертировать ваши Queue::later
в Queue::push
и код будет работать без ошибок.
Что касается явного удаления задачи в очереди, то по большей части это не нужно. Однако вы должны учитывать службы очереди, которые не обеспечивают автоматическое удаление задания.
С моей стороны, AWS SQS (служба очереди сообщений) автоматически удаляет задание после его извлечения из очереди.
Других решений пока нет …