У меня возникает странная проблема, когда вы бросаете исключение из моего класса работы beanstalkd. Когда я бросаю простое исключение (throw new \Exception();
) вне класса задания, он вызывает метод report() в приложении \ Exceptions \ Handler, и я могу сделать там свои настройки. Но когда я бросаю исключение внутри класса задания, он не вызывает метод report(). Вся реализация очереди основана на документации laravel (https://laravel.com/docs/5.1/queues) и отлично работает. Что может быть причиной этого? Любая помощь будет высоко оценен.Обработчик исключений Laravel для работника очереди
2
A
ответ
3
Ну, это должно быть иначе для очередей. Если задание выходит из строя (генерирует исключение), вы не хотите передавать элемент управления обработчику исключений - вы хотите поймать ошибку и пометить задание как потертое.
Просмотр Worker.php (строка 294+):
protected function raiseExceptionOccurredJobEvent($connection, Job $job, $exception)
{
if ($this->events) {
$data = json_decode($job->getRawBody(), true);
$this->events->fire(new Events\JobExceptionOccurred($connection, $job, $data, $exception));
}
}
См process()
на линиях 201-223, а также.
Laravel поймает исключение, но уволит Событие, чтобы вы знали, что возникла проблема. Если вам нужно подключиться к нему - просто слушайте это событие.
0
С Laravel 5.1 У меня была такая же проблема, когда я использую QUEUE_DRIVER=sync
, когда я изменил его на QUEUE_DRIVER=redis
и обработчик исключений начал делать это работа, я имею в виду stardted вызвать метод report()
.
Убедитесь, что вы используете ЗАПУСК artisan queue:work redis
с --daemon
Спасибо @Denis Mysenko. Согласен. Прослушивание события, похоже, является лучшей идеей, которая делает код чистым и удобным. –
У меня есть другой Worker.php в моем Laravel 5.1. Какую версию вы используете? –
В laravel 5.3 Я нашел эту функцию. Спасибо. –