2016-06-07 13 views
2

Ich habe ein seltsames Problem beim Werfen der Ausnahme innerhalb meiner Beanstalkd Job-Klasse. Wenn ich eine einfache Exception (throw new \Exception();) außerhalb der Jobklasse schreibe, ruft sie die report() -Methode in App \ Exceptions \ Handler auf, und ich kann dort meine Änderungen vornehmen. Aber wenn ich die Ausnahme in die Jobklasse werfe, ruft sie die report() -Methode nicht auf. Die gesamte Warteschlangenimplementierung basiert auf der Laravel-Dokumentation (https://laravel.com/docs/5.1/queues) und funktioniert hervorragend. Was kann der Grund dafür sein? Jede Hilfe würde sehr geschätzt werden.Laravel Exception-Handler für Warteschlangen-Worker

Antwort

3

Nun, es musste für Warteschlangen anders sein. Wenn ein Job fehlschlägt (eine Ausnahme auslöst), möchten Sie das Steuerelement nicht an den Ausnahmehandler übergeben. Sie möchten den Fehler abfangen und den Job als fehlgeschlagen markieren.

Ansehen 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)); 
    } 
} 

process() auf den Leitungen 201-223 und See.

Laravel wird die Ausnahme abfangen, aber ein Ereignis auslösen, um Sie darauf hinzuweisen, dass ein Problem aufgetreten ist. Wenn Sie sich darauf einlassen müssen, hören Sie einfach auf diese Veranstaltung zu.

+1

Dank @Denis Mysenko. Ich stimme zu. Das Hören der Veranstaltung scheint eine bessere Idee zu sein, die den Code sauber und handlich macht. –

+0

Ich habe eine andere Worker.php in meinem Laravel 5.1. Welche Version verwendest du? –

+0

In Laravel 5.3 habe ich diese Funktion gefunden. Vielen Dank. –

0

Mit 5,1 Laravel Ich hatte das gleiche Problem, wenn ich QUEUE_DRIVER=sync wurde mit, wenn ich es zu QUEUE_DRIVER=redis und Exception-Handler geändert begann es Arbeit zu tun, ich meine stardted die report() Methode aufzurufen.

Seien Sie sicher, dass Sie Start laufen verwenden artisan queue:work redis mit --daemon