2016-07-21 22 views
0

In Laravel im Hintergrund laufen, ich bin wie diese im Hintergrund ausgeführt werden solltePrevent ein Job, in Code aufgerufen, überlappend mit Job in Laravel

Artisan::queue('mediaserver:process-queue', ['index' => $indexName]); 

gleiche Arbeit einen Job in meinem Code ausgeführt wird jeder Stunde. Manchmal möchte ich es über meine Benutzeroberfläche (also über Code) auslösen, um Dinge zu befestigen. Was ich verhindern muss ist, dass der Prozess startet, während er immer im Hintergrund läuft.

Was ist die beste Arbeitsmethode dafür?

+0

Sie werden nicht in der Lage sein, die Warteschlange für den Job zu überprüfen. Verwenden Sie stattdessen eine Tabelle "running_jobs", in die eine Zeile mit eindeutigen Informationen eingefügt wird, z. B. eine Spalte mit der Jobklasse. Achten Sie auf Jobs, die versendet werden, und lassen Sie sie die Zeile erstellen. Wenn Jobs beendet sind, lassen Sie sie die Zeile löschen. Überprüfen Sie das Vorhandensein der Zeile, bevor Sie den Job absetzen. – Ohgodwhy

Antwort

1

Der Taskplaner von Laravel verarbeitet überlappende Jobs nach creating a temp file before the command runs, and destroying it after.

Der Name der Datei basiert auf dem Cron-Zeitplanausdruck und dem Befehlsnamen.

The existence of this file cause subsequent attempts to run the same command to be skipped

Ich würde so etwas wie dies tun. An der Spitze Ihrer mediaserver:process-queue Aufgabe würde ich prüfen, ob eine temporäre Datei namens mediaserver__process_queue in storage/ existiert. Wenn dies der Fall ist, beenden Sie. Wenn es nicht erstellt wird. Zerstöre es, wenn die Aufgabe beendet ist.

Sie müssen nur vorsichtig sein, wie Sie mit Szenarien umgehen, in denen der Task unerwartet von einer nicht abgefangenen Ausnahme beendet wird, sodass mediaserver__process_queue verbleibt, obwohl der Task nicht mehr ausgeführt wird.