2017-09-10 24 views
1

要求をリモートサービスに送信するキューがあります。時にはこのサービスはメンテナンスを受けます。このような状況に遭遇した場合、すべてのキュータスクを一時停止して10分後に再試行したい。それをどうやって実装するのですか?Laravelキューを一時停止する方法

答えて

1
<?php 

namespace App\Jobs; 

use ... 

class SendRequest implements ShouldQueue 
{ 
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; 

    const REMOTE_SERVER_UNAVAILABLE = 'remote_server_unavailable'; 

    private $msg; 
    private $retryAfter; 

    public function __construct($msg) 
    { 
     $this->msg = $msg; 
     $this->retryAfter = 10; 
    } 

    /** 
    * Execute the job. 
    * 
    * @return void 
    */ 
    public function handle(){ 
     try { 
      // if we have tried sending the request and get a RemoteServerException, we will 
      // redispatch the job directly and return. 
      if(Cache::get(self::REMOTE_SERVER_UNAVAILABLE)) { 
       self::dispatch($this->msg)->delay(Carbon::now()->addMinutes($this->retryAfter)); 
       return;     
      } 
      // send request to remote server 
      // ... 
     } catch (RemoteServerException $e) { 
      // set a cache value expires in 10 mins if not exists. 
      Cache::add(self::REMOTE_SERVER_UNAVAILABLE,'1', $this->retryAfter); 
      // if the remote service undergoes a maintenance, redispatch a new delayed job. 
      self::dispatch($this->msg)->delay(Carbon::now()->addMinutes($this->retryAfter));    
     } 
    } 
} 
+0

しかし、その場合、すべてのジョブがサーバーに当たることになります。たとえば、キュ​​ーに1000個のジョブがある場合、すべてのジョブは10分ごとにリクエストを試みます。私が望むのは、1つのジョブがメンテナンス例外を取得した場合、他のジョブをすべて停止する必要があるということです。 – Poma

+1

こんにちはポマ、遅くまで申し訳ありません。私は自分の答えを編集しました。確認してください。キューを一時停止することはできませんが、リモートサーバが利用できないことがわかっている場合は、reqeustの送信を停止するためにグローバル変数(たとえば、redisの変数)を使用できます。 –

+0

素晴らしいアイデア!不要なリクエストを避ける – Poma

関連する問題