Ausführungskontext - AWS Flow Framework für Java

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Ausführungskontext

Das Framework gibt dem Workflow und den Aktivitätsimplementierungen einen Umgebungskontext. Dieser Kontext bezieht sich jeweils auf die ausgeführte Aufgabe und stellt einige Dienstprogramme bereit, die Sie in der Implementierung verwenden können. Ein Kontextobjekt wird jedes Mal erstellt, wenn eine neue Aufgabe vom Auftragnehmer verarbeitet wird.

Entscheidungskontext

Wenn eine Entscheidungsaufgabe ausgeführt wird, stellt das Framework den Kontext für die Workflow-Implementierung über die DecisionContext-Klasse zur Verfügung. DecisionContext liefert kontextsensitive Informationen wie die ID des Workflow-Ausführungslaufs und die Takt- und Timerfunktionalität.

Zugreifen auf den Entscheidungskontext in der Workflow-Implementierung

Sie können auf den DecisionContext in Ihrer Workflow-Implementierung unter Verwendung der DecisionContextProviderImpl-Klasse zugreifen. Alternativ können Sie den Kontext in einem Feld oder einer Eigenschaft Ihrer Workflow-Implementierung angeben. Verwenden Sie dazu Spring, wie im Abschnitt "Prüfbarkeit und Dependency Injection" beschrieben.

DecisionContextProvider contextProvider = new DecisionContextProviderImpl(); DecisionContext context = contextProvider.getDecisionContext();

Erstellen einer Uhr und eines Timers

Der DecisionContext enthält eine Eigenschaft vom Typ WorkflowClock, die eine Timer- und Uhrfunktion bereitstellt. Da die Workflow-Logik deterministisch sein muss, sollten Sie die Systemuhr in Ihrer Workflow-Implementierung nicht direkt verwenden. Die currentTimeMills-Methode in der WorkflowClock gibt den Zeitpunkt des Startereignisses der zu verarbeitenden Entscheidung zurück. So wird sichergestellt, dass Sie denselben Zeitwert bei einer Wiedergabe erhalten und eine deterministische Workflow-Logik erhalten.

WorkflowClock umfasst auch eine createTimer-Methode, die ein Promise-Objekt zurückgibt, das nach einem festgelegten Intervall verfügbar wird. Verwenden Sie diesen Wert als Parameter für andere asynchrone Methoden, um deren Ausführung um einen festgelegten Zeitraum zu verschieben. So können Sie eine asynchrone Methode oder Aktivität effektiv für eine spätere Ausführung planen.

Im folgenden Beispiel wird gezeigt, wie Sie eine Aktivität periodisch aufrufen können.

@Workflow @WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 60, defaultTaskStartToCloseTimeoutSeconds = 10) public interface PeriodicWorkflow { @Execute(version = "1.0") void periodicWorkflow(); } @Activities(version = "1.0") @ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 3600) public interface PeriodicActivity { void activity1(); } public class PeriodicWorkflowImpl implements PeriodicWorkflow { private DecisionContextProvider contextProvider = new DecisionContextProviderImpl(); private WorkflowClock clock = contextProvider.getDecisionContext().getWorkflowClock(); @Override public void periodicWorkflow() { callPeriodicActivity(0); } @Asynchronous private void callPeriodicActivity(int count, Promise<?>... waitFor) { if (count == 100) { return; } PeriodicActivityClient client = new PeriodicActivityClientImpl(); // call activity Promise<Void> activityCompletion = client.activity1(); Promise<Void> timer = clock.createTimer(3600); // Repeat the activity either after 1 hour or after previous activity run // if it takes longer than 1 hour callPeriodicActivity(count + 1, timer, activityCompletion); } } public class PeriodicActivityImpl implements PeriodicActivity { @Override public void activity1() { ... } }

In der Liste oben ruft die asynchrone Methode callPeriodicActivity activity1 auf und erstellt einen Timer mit dem aktuellen AsyncDecisionContext. Sie übergibt das zurückgegebene Promise als Argument an einen rekursiven Aufruf von sich selbst. Dieser rekursive Aufruf wartet, bis der Timer ausgelöst wird (in diesem Beispiel eine Stunde), bevor er ausgeführt wird.

Aktivitätsausführungskontext

Genau wie der DecisionContext enthält der Aktivitätsausführungskontext Kontextinformationen zur Verarbeitung einer Entscheidungsaufgabe. ActivityExecutionContext stellt ähnliche Kontextinformationen bereit, wenn eine Aktivitätsausgabe verarbeitet wird. Dieser Kontext ist für Ihren Aktivitätscode über die Klasse ActivityExecutionContextProviderImpl verfügbar.

ActivityExecutionContextProvider provider = new ActivityExecutionContextProviderImpl(); ActivityExecutionContext aec = provider.getActivityExecutionContext();

Mit ActivityExecutionContext können Sie folgende Aufgaben ausführen:

Heartbeat für eine langfristige Aktivität

Wenn die Aktivität länger ausgeführt wird, muss sie Amazon SWF ihren Fortschritt regelmäßig an melden, um sicherzustellen, dass die Aufgabe voranschreitet. Wenn kein Heartbeat gesendet wird, kann eine Zeitüberschreitung auftreten, wenn diese bei der Registrierung des Aktivitätstyps oder beim Planen der Aktivität definiert wurde. Um einen Heartbeat zu senden, können Sie die recordActivityHeartbeat-Methode im ActivityExecutionContext verwenden. Ein Heartbeat kann auch dazu dienen, laufende Aktivitäten abzubrechen. Weitere Informationen sowie ein Beispiel finden Sie im Abschnitt Fehlerbehandlung.

Abrufen von Details zur Aktivitätsaufgabe

Bei Bedarf können Sie alle Details zu der Aktivitätsaufgabe abrufen, die von Amazon SWF beim Ausführen der Aufgabe an übergeben wurden. Dies umfasst Informationen zu den Eingaben der Aufgabe, Aufgabentyp, Aufgabentoken usw. Wenn Sie eine Aktivität implementieren möchten, die manuell abgeschlossen wird - z. B. durch eine menschliche Aktion -, müssen Sie dieActivityExecutionContextum das Aufgaben-Token abzurufen und an den Prozess zu übergeben, der die Aktivitätsaufgabe schließlich abschließt. Weitere Informationen finden Sie im Abschnitt zu Aktivitäten manuell abschließen.

Abrufen des Amazon SWF-Client-Objekts, das von der Ausführung verwendet wird

Das von der Ausführung verwendete Amazon SWF-Client-Objekt kann durch Aufrufen des -Client-Objekts abgerufen werdengetService-Methode beiActivityExecutionContextaus. Dies ist nützlich, wenn Sie den Amazon SWF-Service direkt aufrufen möchten.