2015-01-11 12 views
5

abgeschlossen ist Ich muss überprüfen, ob Job in der Warteschlange (Beanstalkd) in Laravel (Laravel 5) abgeschlossen wurde und falls es fertig ist muss ich aktualisierte Datensatz (Aufgabe hinzugefügt zum Warteschlangenaktualisierungsdatensatz in der Datenbank). Ich habe zu meinem composer.json hinzugefügt:Wie überprüft man, ob der Job in der Beanstalkd-Warteschlange in Laravel

"pda/pheanstalk": "3.*" 

ich Job hinzufügen auf diese Weise in der Warteschlange:

$jobId = Queue::push('App\Class', $object->toArray(), $this->getQueueName()); 

ich überprüfen, ob Auftrag abgeschlossen wurde verwendet, ist die folgende Funktion:

public function find($queueName, $jobId, $recordId) 
{ 
    $phean = Queue::getPheanstalk(); 

    try { 
     $phean->peek($jobId); 
     $data = ['status' => 'waiting']; 
    } catch (ServerException $e) { 
     $message = $e->getMessage(); 

     if ($message == 'NOT_FOUND: Job ' . $jobId . ' does not exist.') { 
      $data = ... // here I get from database data for $recordId 

     } else { 
      $data = ['status' => 'error']; 
     } 
    } 

    return $data; 
} 

Die Frage ist - ist das eine zuverlässige Methode, um zu überprüfen, ob der Job abgeschlossen wurde? Ich vergleiche hier nur die Nachricht, die ich von der Ausnahme bekomme. Ich habe keine andere Möglichkeit gefunden zu überprüfen, ob der Job abgeschlossen wurde.

Antwort

1

Ich habe Laravel 5 noch nicht verwendet, aber auf Laaravel 4 haben Sie die fehlgeschlagene Jobtabelle. Wo Sie sehen können, welche Jobs NICHT abgeschlossen wurden. Ich gehe davon aus, dass L5 etwas haben oder den gleichen Prozess beibehalten kann. Das würde dein Problem nicht lösen?

Aus meiner Sicht scheint es, dass Sie nur die Perspektive invertieren. Anstatt zu suchen, was gescheitert ist, suchen Sie, was funktioniert hat.

Quelle: http://laravel.com/docs/4.2/queues#failed-jobs

0

Ich benutze Laravel nicht 5 vor. Aber mit Laravel 4 muss ein Job, wenn er beendet ist, manuell aus der Warteschlange gelöscht werden. Hier ist die offizielle Dokumentation:

Deleting A Processed Job: Once you have processed a job, it must be deleted from the queue, which can be done via the delete method on the Job instance

Es bedeutet einfach, dass, wenn Sie nicht, ein solches Verfahren verwenden haben, wird der Auftragsstatus unvollendet bleiben. In Ihrem Fall können Sie die Warteschlange abrufen und prüfen, ob die Job-ID vorhanden ist.

+0

Sie haben Recht, aber Job geht zu fehlgeschlagenen Jobs, wenn es fehlschlägt. Wenn ich überprüfen möchte, ob der Job abgeschlossen wurde, selbst wenn ich nach fehlgeschlagenen Jobs gesucht habe, muss ich irgendwie überprüfen, ob der Job noch in der Warteschlange ist, weil er sich immer noch in der Warteschlange befindet und nicht in fehlgeschlagenen Jobs. –

+0

Hey, es scheint, dass pbeanstalk keine Möglichkeit bietet, eine ganze Liste laufender Jobs zu erhalten. Sie können berufsbezogene Informationen in der Datenbank speichern und ihren Status markieren, wenn sie gelöscht oder fehlgeschlagen sind. – Ray

0

Wenn Sie einen Befehl basierend auf einem Job-Finishing auslösen müssen - dann klingt es so, als sollten Sie nur einen wartenden Befehl auslösen, wenn der Job abgeschlossen ist - dann kann Ihr System den Rest erledigen?

Sonst scheint das Abfragen für den Auftrag, um zu sehen, ob/wann er abgeschlossen wird, mühsam und ineffizient zu sein. In Laravel 5 können Sie das neue Tool "Commands" verwenden, das Taylor bereitgestellt hat, und die Implementierung ShouldBeQueued anwenden lassen. Der Befehl wird also in die Warteschlange gestellt, um nach Abschluss der anderen Task ausgeführt zu werden.