2017-09-10 3 views
1

Ich habe eine Warteschlange, die Anforderungen an einen Remote-Dienst sendet. Manchmal wird dieser Service gewartet. Ich möchte, dass alle Warteschlangentasks in 10 Minuten pausieren und erneut versuchen, wenn eine solche Situation auftritt. Wie implementiere ich das?Wie pausieren Sie eine Laravel-Warteschlange

Antwort

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

Aber in diesem Fall würden alle Jobs den Server treffen. Wenn ich zum Beispiel 1000 Jobs in der Warteschlange habe, versuchen alle, alle 10 Minuten eine Anfrage zu stellen. Was ich will ist, dass, wenn 1 Job Wartung Ausnahme erhält, sollte es alle anderen pausieren. – Poma

+1

Hallo Poma, Entschuldigung für spät. Ich habe meine Antwort bearbeitet, bitte nachsehen. Wir können die Warteschlange nicht pausieren, aber wir können eine globale Variable (z. B. Variable in redis) verwenden, um das Senden des Request zu stoppen, wenn wir bereits wissen, dass der Remote-Server nicht verfügbar ist. –

+0

Großartige Idee! Dies vermeidet unnötige Anfragen – Poma

Verwandte Themen