2016-02-07 5 views
6

Ich habe einen Job in der Warteschlange in Laravel, der von Zeit zu Zeit aufgrund eines externen API-Fehlers aufgrund hoher Auslastung fehlschlägt. Das Problem ist, dass meine Auswahl so zu sein scheint, dass die Laravel-Queue weiterhin die API mit Anfragen hämmert, bis sie erfolgreich ist, oder sie angewiesen wird, nach X-Anfragen zu stoppen.Wie kann ich Verzögerungen zwischen fehlgeschlagenen Jobs in der Warteschlange in Laravel erstellen?

Gibt es eine Möglichkeit für mich, basierend darauf, wie der Job fehlschlägt, es in 5 Minuten erneut zu versuchen, statt weiter zu hämmern?

Ich möchte den integrierten Warteschlangenhandler verwenden, aber die Wiederholungsfunktionalität scheint nicht so zu sein, dass sie reale Fehlerszenarien verarbeiten kann. Ich würde denken, dass viele Gründe für das Scheitern eines Jobs nicht durch sofortiges erneutes Versuchen gelöst werden.

Antwort

9

Was Sie tun können, ist so etwas wie diese:

// app/Jobs/ExampleJob.php 
namespace App\Jobs; 

class ExampleJob extends Job 
{ 
    use \Illuminate\Queue\InteractsWithQueue; 

    public function handle() 
    { 
     try { 
      // Do stuff that might fail 
     } catch(AnException $e) { 
      // Example where you might want to retry 

      if ($this->attempts() < 3) { 
       $delayInSeconds = 5 * 60; 
       $this->release($delayInSeconds); 
      } 
     } catch(AnotherException $e) { 
      // Example where you don't want to retry 
      $this->delete(); 
     } 
    } 
} 

Bitte beachten Sie, dass Sie müssen nicht diese mit Ausnahmen zu tun, können Sie auch prüfen, nur das Ergebnis von Ihren Handlungen und von dort entscheiden.

+0

Danke, ich hatte ein Missverständnis, was die Freigabe der Arbeit tut. Wo hast du die delete() Funktion gefunden? Das scheint nicht dokumentiert zu sein. Ich hoffe, dass es eine unterstützte Möglichkeit gibt, den Job zu entfernen, indem Sie ihn in die Tabelle fehlgeschlagener Jobs einfügen. – Citizen

+1

Ich habe es in der Quelle gefunden: https://github.com/laravel/framework/blob/5.1/src/Illuminate/Queue/InteractsWithQueue.php –

+3

Über das Hinzufügen von ihnen zu der fehlgeschlagenen Aufträge Tabelle. Ich bin mir nicht ganz sicher, wie das funktioniert, aber ich glaube, Sie müssen die Ausnahme (erneut) werfen, damit sie auch vom Warteschlangenarbeiter behandelt wird. –

0

Sie manuell den Auftrag über die Illuminate \ Queue \ InteractsWithQueue Methode wird wieder die Anzahl der Sekunden festlegen, bis der Job zur Verfügung

$this->release(10); 

Das Argument lösen könnten.

Überprüfen Sie den Abschnitt Manuelles Freigeben von Jobs im für Version 5.1.

Verwandte Themen