2013-02-15 19 views
6

Gibt es eine Möglichkeit, einen laufenden Workflow anzuhalten/fortzusetzen, der mit Ketten aus Sellerie 3.0 erstellt wurde?Django Sellerie Workflow-Kette Anhalten/Fortsetzen

Grundsätzlich haben wir zwei verschiedene Arten von Aufgaben in unserem System: interaktive und nicht interaktive Aufgaben. Die nicht interaktiven haben wir alle Parameter für, aber die interaktiven benötigen Benutzereingaben. Beachten Sie, dass wir für die interaktiven Aufgaben nur dann eine Benutzereingabe anfordern können, wenn alle vorherigen Aufgaben in der Kette abgeschlossen sind, da ihre Ergebnisse die interaktiven Aufgaben betreffen (d. H. Wir können keine Benutzereingabe anfordern, bevor die tatsächliche Kette erstellt wird).

Irgendwelche Vorschläge, wie man das angeht? Wirklich ratlos hier ..

Aktuelle Ideen:

  • Erstellen Sie zwei Unterklassen von Aufgabe (von Sellerie Import-Task). Fügen Sie der Interactive-Task-Unterklasse, die standardmäßig auf false festgelegt ist, eine zusätzliche Instanzvariable (Klassenmember) hinzu, die angibt, dass einige Benutzereingaben weiterhin benötigt werden. Irgendwie haben Sie Zugriff auf die Instanz der Aufgabe und setzen sie von außerhalb des Selleriearbeiters auf "Wahr" (obwohl ich das ziemlich oft gelesen habe und es nicht möglich erscheint, direkt von einem anderen Modul aus auf Aufgabenobjekte zuzugreifen)
  • Partitionieren Sie die Kette in mehrere durch interaktive Jobs begrenzte Ketten. Lassen Sie eine Art von Mechanismus außerhalb des Selleriearbeiters erkennen, sobald eine Kette ihr Ende erreicht hat, und lösen Sie die interaktive clientseitige Komponente der interaktiven Aufgabe aus. Sobald der Benutzer alle diese Daten eingegeben hat, rufen Sie die Daten ab und starten Sie die neue Kette, in der sich die interaktive Aufgabe an der Spitze der neuen Kette befindet.

Antwort

2

Wir haben etwas wie Ihre zweite Idee in unserem Projekt implementiert & es funktioniert gut. Hier ist der Kern der Implementierung.

Fügen Sie das neue Feld status zu Ihrem Modell & Override speichern Methode hinzu.

models.py:

class My_Model(models.Model): 
    # some fields 
    status = models.IntegerField(default=0) 

    def save(self, *args, **kwargs): 
     super(My_Model, self).save(*args, **kwargs) 
     from .functions import custom_func 
     custom_func(self.status) 

tasks.py

@celery.task() 
def non_interactive_task(): 
    #do something. 

@celery.task() 
def interactive_task(): 
    #do something. 

functions.py

def custom_func(status): 
    #Change status after non interactive task is completed. 
    #Based on status, start interactive task. 

Pass status Variable zu Vorlage, die für die Anzeige von Benutzeroberflächenelement nützlich ist, um Informationen einzugeben. Wenn Benutzer erforderliche Informationen eingeben, ändern Sie den Status. Dies ruft custom_func, die Ihre interactive_task auslöst.

Verwandte Themen