2016-02-07 10 views
6

高負荷のために外部APIが失敗するため、Laravelでキューに登録されたジョブが失敗することがあります。問題は、私の選択肢が、Laravel QueueがAPIリクエストを成功させるか、X個のリクエスト後に停止するように指示するまで、APIをハンマーにし続けるように見えることです。Laravelで失敗したキュージョブの試行の間に遅延を作成するにはどうすればよいですか?

私の仕事はどのように失敗するかに基づいて、ハンマーで引き続き行うのではなく、5分後にもう一度試してみる方法はありますか?

ビルドインキューハンドラを使用したいが、再試行機能は実際の障害シナリオを処理するために構築されていないように見える。私は仕事を失敗する多くの理由は、すぐに再試行することで解決されないと思います。あなたは何ができるか

答えて

9

はこのようなものです:

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

あなたは例外でこれを行う必要はありませんのでご注意ください、あなたも自分の行動から結果をチェックして、そこから決定することができます。

+0

ありがとう、私は仕事を解放するものの誤解を持っていました。また、delete()関数はどこにありますか?それは文書化されていないようです。私は、失敗したジョブテーブルにジョブを配置してジョブを削除するサポートされた方法があることを期待しています。 – Citizen

+1

ソース:https://github.com/laravel/framework/blob/5.1/src/Illuminate/Queue/InteractsWithQueue.php –

+3

失敗したジョブテーブルに追加する方法については、こちらを参照してください。私はこれがどのように動作するのかはよく分かりませんが、(再)例外をスローして、キューワーカーによって処理されるようにしなければならないかもしれないと信じています。 –

0

は、手動でジョブが再び使用可能になるまでの引数は秒の量を定義します

$this->release(10); 

を照らし\キュー\ InteractsWithQueueメソッドを使用してジョブを解放することができます。

official documentationバージョン5.1に手動でリリースしてください。

関連する問題