2016-02-07 13 views
6

Mam zadanie w kolejce w Laravel, które nie działa od czasu do czasu z powodu awarii zewnętrznego interfejsu API z powodu dużego obciążenia. Problem polega na tym, że moje wybory sprawiają, że kolejka Laravel kontynuuje udoskonalanie interfejsu API z prośbami, dopóki nie powiedzie się, lub przestanie po X liczbie żądań.Jak mogę utworzyć opóźnienia między nieudanymi próbami zadań w kolejce w Laravel?

Czy jest jakiś sposób, abym w oparciu o to, w jaki sposób zawiodła praca, powiedz, aby spróbować ponownie za 5 minut zamiast kontynuować walenie?

Chcę użyć wbudowanej procedury obsługi kolejki, ale funkcja ponawiania nie wydaje się być budowana w celu obsługi rzeczywistych scenariuszy awarii. Sądzę, że wiele powodów niepowodzenia pracy nie zostałoby rozwiązanych przez natychmiastową ponowną próbę.

Odpowiedz

9

Co można zrobić, to coś takiego:

// 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(); 
     } 
    } 
} 

Należy pamiętać, że nie trzeba robić to z wyjątkami, można też po prostu sprawdzić wynik ze swoich działań i zdecydować stamtąd.

+0

Dzięki, miałem nieporozumienie co do tego, co robi praca. Również, gdzie znalazłeś funkcję delete()? To nie wydaje się być udokumentowane. Mam nadzieję, że istnieje obsługiwany sposób usunięcia zadania poprzez umieszczenie go w tabeli zakończonych niepowodzeniem. – Citizen

+1

Znalazłem go w źródle: https://github.com/laravel/framework/blob/5.1/src/Illuminate/Queue/InteractsWithQueue.php –

+3

Informacje o dodawaniu ich do tabeli zakończonych niepowodzeniem. Nie jestem do końca pewien, jak to działa, ale myślę, że być może trzeba będzie (ponownie) rzucić wyjątek, aby był on również przetwarzany przez moduł kolejki. –

0

Można ręcznie uruchomić zadanie przy użyciu metody Illuminate \ Kolejka \ InteractsWithQueue

$this->release(10); 

Argument określi ilość sekund, dopóki zadanie nie jest dostępny.

Sprawdź sekcja Ręczne zwalnianie Praca w official documentation dla wersji 5.1.

Powiązane problemy