I am having a weird issue while throwing the exception inside my beanstalkd job class. When I throw a simple exception (throw new \Exception();
) outside the job class, it calls the report() method in App\Exceptions\Handler and I can do my tweaks there. But when I throw the exception inside the job class, it does not call the report() method. All the queue implementation is based on laravel documentation(https://laravel.com/docs/5.1/queues) and works great. What can be the reason for this? Any help would be highly appreciated.
Laravel exception handler for queue worker
Asked Answered
Well, it had to be different for queues. If a job fails (throws an exception), you don't want to give the control to the Exception handler – you want to catch the error and mark the job as failed.
Look inside Worker.php (line 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));
}
}
See process()
on lines 201-223 as well.
Laravel will catch the exception but will fire an Event to let you know there has been a problem. If you need to hook into it – just listen for this event.
Thanks @Denis Mysenko. I agree. Listening to the event seems to be a better idea which makes the code clean and handy. –
Arv
i have another Worker.php in my Laravel 5.1. What version do you use? –
Nought
In laravel 5.3 I have found this function. Thank you. –
Nought
With laravel 5.1 I had the same problem when I was using QUEUE_DRIVER=sync
when I changed it to QUEUE_DRIVER=redis
and exception handler started to do it's job, I mean stardted to call the report()
method.
Be sure you use run start artisan queue:work redis
with --daemon
© 2022 - 2024 — McMap. All rights reserved.