2016-06-07 3 views
2

У меня возникает странная проблема, когда вы бросаете исключение из моего класса работы beanstalkd. Когда я бросаю простое исключение (throw new \Exception();) вне класса задания, он вызывает метод report() в приложении \ Exceptions \ Handler, и я могу сделать там свои настройки. Но когда я бросаю исключение внутри класса задания, он не вызывает метод report(). Вся реализация очереди основана на документации laravel (https://laravel.com/docs/5.1/queues) и отлично работает. Что может быть причиной этого? Любая помощь будет высоко оценен.Обработчик исключений Laravel для работника очереди

ответ

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 поймает исключение, но уволит Событие, чтобы вы знали, что возникла проблема. Если вам нужно подключиться к нему - просто слушайте это событие.

+1

Спасибо @Denis Mysenko. Согласен. Прослушивание события, похоже, является лучшей идеей, которая делает код чистым и удобным. –

+0

У меня есть другой Worker.php в моем Laravel 5.1. Какую версию вы используете? –

+0

В laravel 5.3 Я нашел эту функцию. Спасибо. –

0

С Laravel 5.1 У меня была такая же проблема, когда я использую QUEUE_DRIVER=sync, когда я изменил его на QUEUE_DRIVER=redis и обработчик исключений начал делать это работа, я имею в виду stardted вызвать метод report().

Убедитесь, что вы используете ЗАПУСК artisan queue:work redis с --daemon