队列工作者的Laravel异常处理程序

时间:2016-06-07 18:28:31

标签: php laravel exception exception-handling beanstalkd

我在beanstalkd作业类中抛出异常时遇到了一个奇怪的问题。当我在作业类之外抛出一个简单的异常(throw new \Exception();)时,它调用App \ Exceptions \ Handler中的report()方法,我可以在那里进行调整。但是当我在作业类中抛出异常时,它不会调用report()方法。所有队列实现都基于laravel文档(https://laravel.com/docs/5.1/queues)并且运行良好。这可能是什么原因?任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:6)

嗯,队列必须有所不同。如果作业失败(抛出异常),您不希望将控件提供给异常处理程序 - 您希望捕获错误并将作业标记为失败。

查看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将捕获异常,但会触发一个事件,让您知道存在问题。如果您需要加入它 - 只需听听此事件。

答案 1 :(得分:0)

使用laravel 5.1我在使用QUEUE_DRIVER=sync时遇到了同样的问题,当我将其更改为QUEUE_DRIVER=redis并且异常处理程序开始执行它的工作时,我的意思是强制调用report()方法

请确保将运行开始artisan queue:work redis--daemon

一起使用