2 Stimmen

Verwendung der Drupal-Batch-Api mit Diensten

Ich habe eine Drupal-App, die einige ihrer Inhalte veröffentlichen muss - es gibt ein Flash-Wysiwyg-Frontend, das mit einem Drupal-Backend über das Services-Modul kommuniziert. Der Benutzer kann Bilder/Videos hochladen, sie in Flash platzieren und bearbeiten, und wenn er fertig ist, eine statische Version exportieren. Als Teil dieses Exportprozesses muss die App einige Verarbeitung auf die Medienelemente zu tun - Skalierung &etc, so habe ich die Batch-Api verwenden, so dass es nur Prozesse auf ein Element zu einer Zeit, Timeouts und so weiter zu stoppen. Dies funktioniert meist ok, aber ich bin immer unstuck durch die Art und Weise batchapi scheint zu arbeiten. Was ich versuche zu tun ist dies:

  1. Das Flash-Tool ruft den Exportdienst auf
  2. Der Exportdienst erstellt einen Knoten, der diesen Export darstellt, und gibt eine node_id
  3. Der Exportdienst löst den Export im Hintergrund aus. Sobald er abgeschlossen ist, wird ein Status im Knoten
  4. In der Zwischenzeit fragt das Flash-Tool die App ab, um zu sehen, wann die Veröffentlichung abgeschlossen ist, und benachrichtigt den Benutzer.

Was mich im Moment aus der Bahn zu werfen scheint, ist das Auslösen des Batch-Prozesses im Hintergrund, ohne die Umleitung auszulösen, die Batch macht, wenn ich batch_process() so dass ich die Node-ID an Flash zurückgeben und gleichzeitig den Stapel auslösen kann.

Ich hoffe, das macht Sinn - haben Sie Vorschläge oder Ideen? Oder mache ich es falsch?

2voto

Henrik Opel Punkte 19268

Ich bin mir nicht 100%ig sicher (habe die Batch-API schon länger nicht mehr verwendet), aber ich sehe im Moment 3 Optionen:

  1. Verwenden Sie Ihren aktuellen Workflow und setzen Sie den Stapel "init_message" auf einen Wert, der die Knoten-ID enthält:
    • Rufen Sie an. batch_process() und akzeptiert die Weiterleitung. Ihre Flash-App müsste der Weiterleitung folgen und dann die zurückgegebene Seite analysieren, um die Knoten-ID aus der angezeigten Nachricht zu extrahieren
    • klingt allerdings hässlich, da man die Standard-Batch-Initialisierungsseite parsen müsste :/
  2. Vergessen Sie die Abfrage und lassen Sie das Blitzgerät auf das Ergebnis warten:
    • Wie bei Option 1 müsste Ihr Flash-Tool in der Lage sein, die von der Stapelverarbeitung ausgegebenen Umleitungen zu verarbeiten - Sie würden die Stapelverarbeitung starten, indem Sie die $redirect_url zu einer Seite, die das von der Flash-Anwendung benötigte Ergebnis zurückgibt.
    • Ihre Flash-Anwendung folgt den Weiterleitungen und sucht immer nach der Ergebnisseite - sobald diese erreicht ist, verwendet sie sie einfach.
    • Ich bin mir allerdings nicht sicher, wie das mit dem Dienstleistungsmodul zusammenpassen würde :/
  3. Teilen Sie die Initialisierung in Ihrem Workflow auf:
    1. Flash-Tool ruft Exportdienst über eine "Bootstrap"-URL auf
    2. Exportdienst erstellt Knoten und gibt Knoten-ID zurück (hier wird kein Batch gestartet!)
    3. Das Flash-Tool ruft die Knoten-ID ab und ruft den Exportdienst über eine "Prozess"-URL auf, wobei die Knoten-ID übergeben wird.
    4. Der Exportdienst verwendet die übergebene Knotennummer, um die eigentliche Stapelverarbeitung einzuleiten (erstellt einen Stapel und ruft batch_process() auf).
    5. ... mit dem ursprünglichen Arbeitsablauf fortfahren (Abfragen usw.)

Die letzte Version scheint die einfachste und sauberste zu sein, allerdings um den Preis einer zusätzlichen Anfrage, um das Ganze zu starten, was in Ihrem Szenario ein kleines Problem sein dürfte.


編集する。

  • Eine Variante von Option 3 könnte darin bestehen, dass der anfängliche Exportdienst (derjenige, der den Knoten erstellt) die Batch-Initialisierungsseite mit Hilfe einer drupal_http_request() selbst, bevor die Knoten-ID an die Flash-Anwendung zurückgegeben wird. Dieselbe Grundidee (Aufteilung der anfänglichen Anforderung in eine, die den Knoten erstellt, und eine andere, die den Stapel startet), aber aus der Sicht der Flash-Anwendung mehr in sich geschlossen, da sie die Verarbeitung nicht durch zwei separate Aufrufe auslösen muss.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X