2016-06-07 83 views
2

我在我的beanstalkd作業類中拋出異常時出現了一個奇怪的問題。當我在作業類之外拋出一個簡單的異常(throw new \Exception();)時,它會調用App \ Exceptions \ Handler中的report()方法,我可以在那裏做我的調整。但是,當我在作業類中拋出異常時,它不調用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

我在Laravel 5.1中有另一個Worker.php。你使用什麼版本? –

+0

在laravel 5.3中我找到了這個函數。謝謝。 –

0

隨着laravel 5.1當我使用QUEUE_DRIVER=sync時,我改變它爲QUEUE_DRIVER=redis和異常處理程序開始做它的工作,我的意思是打電話report()方法。

以確保您使用運行開始artisan queue:work redis與​​