Laravel 队列工作者的异常处理程序
Laravel exception handler for queue worker
我在 beanstalkd 作业中抛出异常时遇到了一个奇怪的问题 class。当我在作业 class 外抛出一个简单异常 (throw new \Exception();
) 时,它会调用 App\Exceptions\Handler 中的 report() 方法,我可以在那里进行调整。但是当我在作业 class 中抛出异常时,它不会调用 report() 方法。所有队列实现都基于 laravel 文档(https://laravel.com/docs/5.1/queues)并且效果很好。这可能是什么原因?任何帮助将不胜感激。
好吧,队列必须有所不同。如果作业失败(抛出异常),您不想将控制权交给异常处理程序 - 您想要捕获错误并将作业标记为失败。
往里看 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));
}
}
另见第 201-223 行 process()
。
Laravel 会捕获异常,但会触发一个事件让您知道出现了问题。如果你需要连接它——只需要监听这个事件。
使用 laravel 5.1 我在使用 QUEUE_DRIVER=sync
时遇到了同样的问题,当我将其更改为 QUEUE_DRIVER=redis
并且异常处理程序开始执行它的工作时,我的意思是开始调用report()
方法。
请务必使用 运行 start artisan queue:work redis
with --daemon
我在 beanstalkd 作业中抛出异常时遇到了一个奇怪的问题 class。当我在作业 class 外抛出一个简单异常 (throw new \Exception();
) 时,它会调用 App\Exceptions\Handler 中的 report() 方法,我可以在那里进行调整。但是当我在作业 class 中抛出异常时,它不会调用 report() 方法。所有队列实现都基于 laravel 文档(https://laravel.com/docs/5.1/queues)并且效果很好。这可能是什么原因?任何帮助将不胜感激。
好吧,队列必须有所不同。如果作业失败(抛出异常),您不想将控制权交给异常处理程序 - 您想要捕获错误并将作业标记为失败。
往里看 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));
}
}
另见第 201-223 行 process()
。
Laravel 会捕获异常,但会触发一个事件让您知道出现了问题。如果你需要连接它——只需要监听这个事件。
使用 laravel 5.1 我在使用 QUEUE_DRIVER=sync
时遇到了同样的问题,当我将其更改为 QUEUE_DRIVER=redis
并且异常处理程序开始执行它的工作时,我的意思是开始调用report()
方法。
请务必使用 运行 start artisan queue:work redis
with --daemon