Background Queue: Spezifischer BackgroundJob manuell starten?

  • Hallo zusammen

    Ich möchte bei meinem PlugIn gerne einzelne, spezifische BackgroundJobs nach dem Einfügen in die Queue manuell (z.B. via AJAX Action) starten können.

    Hintergrund ist, dass mein PlugIn auf einen Schlag sehr viele BackgroundJobs generiert, welche jeder 1-1.5 Minute dauern kann und es somit einige Zeit geht, bis die Queue abgearbeitet ist. Der Anwender soll aber die Möglichkeit haben, einzelne Jobs, unabhängig von der Position in der Queue, manuell sofort zu starten, um die entsprechenden Resultate sofort zu erhalten.

    Soweit ich gesehen habe, gibt wcf\system\background\BackgroundQueueHandler->enqueueAt() aber keinerlei Referenz zum Job zurück, auf welche man dafür zurückgreifen könnte.

    Mein Ansatz wäre nun die BackgroundQueueHandler-Klasse zu erweitern und eine alternative enqueueAt() Funktion zu schreiben, welche die jobID zurück gibt, sowie eine Funktion die dann auf Basis der jobID den Job ausführen kann.

    Oder habe ich da was übersehen und das ginge viel einfacher?

    Danke im Voraus für Euer Feedback.

    Gruss, Tensai

  • Tensai September 2, 2020 at 9:05 AM

    Changed the title of the thread from “Background Queue: Sezifischer BackgroundJob manuell starten?” to “Background Queue: Spezifischer BackgroundJob manuell starten?”.
  • verwende ->performJob($job) um einen Job „zu sofort“ auszuführen. Im Falle eines Misserfolgs wird dieser automatisch gequeued.

    Danke, das ist mir bekannt, hilft aber nicht. Denn performJob() verlangt nach einem JobObjekt, welches ja aber nicht (mehr) bekannt ist, da die Jobs schon längst in der Queue (Datenbank) sind und das Skript, das die Jobs gequeued hat, beendet ist.

    Nochmals zur Veranschaulichung:

    1. Ein Skript wird von extern per API-Aufruf gestartet und schreibt x Items in die DB. Zu jedem Item wird ein BackgroundJob gequeued um weitere Infos zu dem Item zu suchen und in die DB zu schreiben. -> API-Skript ist fertig.

    2. User ruft die ItemsPage auf um die Items anzuschauen und sieht, dass für Item y die zusätzlichen Informationen noch fehlen, möchte die aber sofort haben. -> Hier sollte nun die Möglichkeit bestehen, mit einer AJAX Action den BackgroundJob für Item y sofort auszuführen um die Infos anzuzeigen.

    Gruss, Tensai

    Edited 2 times, last by Tensai (September 2, 2020 at 10:02 AM).

  • Hallo,

    für die Background Queue gelten grundsätzlich keine Kompatibilitätsgarantien abseits der PHP-API. Inbesondere nicht für die Datenbankstruktur. Ein Ausführen von bereits gequeueten Jobs ist daher nicht unterstützt. Der BackgroundQueueHandler sollte sinnvollerweise eigentlich auch final sein.

    2. User ruft die ItemsPage auf um die Items anzuschauen und sieht, dass für Item y die zusätzlichen Informationen noch fehlen, möchte die aber sofort haben. -> Hier sollte nun die Möglichkeit bestehen, mit einer AJAX Action den BackgroundJob für Item y sofort auszuführen um die Infos anzuzeigen.

    Da du die Daten hier ohnehin synchron abholen möchtest, könntest du einfach einen komplett neuen Job synchron ausführen. Der bereits gequeuete Job könnte dann beispielsweise sehen, dass die Daten bereits existieren und dann „nichts tun“.

  • Da du die Daten hier ohnehin synchron abholen möchtest, könntest du einfach einen komplett neuen Job synchron ausführen. Der bereits gequeuete Job könnte dann beispielsweise sehen, dass die Daten bereits existieren und dann „nichts tun“.

    Hmm, ja, so geht das natürlich auch. Danke für diesen Denkanstoss.

    Den eh schon bestehenden Job manuell starten zu können, wäre aber IMHO die deutlich elegantere Lösung . ;)

    So als Idee für ne nächste Version um die BackgroundQueue ewas flexibler zu machen. Wie gesagt müssten eigentlich die enqueueAt() bzw. enqueueIn() Funktionen einfach nur die jobIDs zurückgeben und eine performJobByID($jobID) Funktion implementiert werden.

    Gruss, Tensai

    Edited once, last by Tensai (September 2, 2020 at 10:30 AM).

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!