#laravel #laravel-queue #laravel-5.8
#laravel #laravel-очередь #laravel-5.8
Вопрос:
У меня есть проект Laravel с очередью, выполняющий ~ 1000 заданий в день.
Когда задание не выполняется, в версии 5.7 оно было перемещено в таблицу failed_jobs, и я смог повторить попытку.
После перехода на Laravel 5.8 задания просто исчезают.
Этот код должен пометить задание как неудачное и поместить его в таблицу неудачных заданий.
/**
* Execute the job.
*/
public function handle()
{
throw new Exception('WRONG JOB');
}
Журнал супервизора в этом случае:
[2019-04-10 15:07:57][11932] Processing: AppJobsExecuteAction
Кажется, что выполнение останавливается, и событие Queue::failing не вызывается.
Этот код работает, но мне кажется неправильным.
class ExecuteAction implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Execute the job.
*/
public function handle()
{
try {
throw new Exception('WROOONG');
} catch (Exception $e) {
if ($this->attempts() < $this->tries) {
$this->release(10);
} else {
$this->fail($e);
}
}
}
}
Вызывается событие Queue::failing .
Журнал супервизора ;
[2019-04-10 15:06:52][11926] Processing: AppJobsExecuteAction
[2019-04-10 15:06:52][11926] Failed: AppJobsExecuteAction
[2019-04-10 15:06:52][11926] Processed: AppJobsExecuteAction
В supervisor conf
command=php /path/to/laravel-project/artisan queue:listen
Что я делаю не так?
Спасибо за вашу помощь.
Комментарии:
1. Какой драйвер очереди вы используете?
2. Привет, я использую
database
.3. Если вы не укажете параметр —tries . Задание никогда не будет сохранено в таблице сбоев…
4. @shock_gone_wild Это не очевидно после прочтения документации, но, изучив рабочий код в framework, кажется, вы правы. В документе также объясняется, что я могу использовать
public $tries = 5;
в своем классе заданий, но, похоже, он не используется.5. Насколько я могу судить, этот public $tries = 5 работает. Я только что протестировал его с указанием —tries=2 и без указания —tries в рабочей команде. В обоих случаях после 5 попыток задание отправляется в таблицу неудачных заданий
Ответ №1:
Откуда: https://laravel.com/docs/5.8/queues
Команда: queue:listen
была удалена из документации, и теперь рекомендуемый способ работы с очередями — выполнить: queue:work
.
См.: https://laravel.com/docs/5.8/queues#running-the-queue-worker
Или вы можете использовать: Laravel Horizon
Комментарии:
1. Привет, спасибо за ваш ответ. Я использую
queue:listen
из-за утечки памяти после нескольких тысяч заданий по http-запросам. Я пробовалqueue:work
, и проблема та же. Что касается Horizon, я не могу использовать его как мое соединение с очередьюdatabase
, и это только работаredis
.2. Вы можете предоставить журнал?