Implementierung von Aktivitäten - 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.

Implementierung von Aktivitäten

Die Aktivitäten werden durch eine Implementierung der @Activities-Schnittstelle realisiert. DieAWS Flow Frameworkfür Java verwendet die für den Worker konfigurierten Aktivitäts-Implementierungsinstances, um Aktivitätsaufgaben zur Laufzeit zu verarbeiten. Der Worker sucht automatisch die Aktivitätsimplementierung des entsprechenden Typs.

Über Eigenschaften und Felder können Sie Ressourcen an Aktivitäts-Instances wie z. B. Datenbankverbindungen übergeben. Da von mehreren Threads auf das Implementierungsobjekt der Aktivität zugegriffen werden kann, müssen gemeinsame Ressourcen Thread-sicher sein.

Beachten Sie, dass die Aktivitätsimplementierung keine Parameter vom Typ Promise<> oder Rückgabeobjekte dieses Typs akzeptiert. Die Implementierung der Aktivität sollte nicht davon abhängen, wie sie aufgerufen wurde (synchron oder asynchron).

Die zuvor gezeigte Aktivitätsschnittstelle kann folgendermaßen implementiert werden:

public class MyActivitiesImpl implements MyActivities { @Override @ManualActivityCompletion public int activity1(){ //implementation } @Override public void activity2(int foo){ //implementation } }

Der Aktivitätsimplementierung steht ein Thread-lokaler Kontext zur Verfügung, über den das verwendete Aufgabenobjekt, Datenkonverter-Objekt etc. abgerufen werden kann. Auf den aktuellen Kontext kann über ActivityExecutionContextProvider.getActivityExecutionContext() zugegriffen werden. Weitere Informationen zu ActivityExecutionContext finden Sie in der AWS SDK for Java-Dokumentation und im Abschnitt Ausführungskontext.

Aktivitäten manuell abschließen

Die @ManualActivityCompletion-Annotation im obigen Beispiel ist eine optionale Annotation. Sie ist nur bei Methoden erlaubt, die eine Aktivität implementieren. Sie wird verwendet, um die Aktivität so zu konfigurieren, dass sie bei der Rückkehr aus der Aktivitätsmethode nicht automatisch beendet wird. Dies könnte nützlich sein, wenn Sie die Aktivität asynchron abschließen möchten, z. B. manuell, nachdem eine menschliche Aktion abgeschlossen wurde.

Standardmäßig sieht das Framework die Aktivität als abgeschlossen an, sobald Ihre Aktivitätsmethode die Kontrolle zurückgibt. Dies bedeutet, dass der Aktivitäts-Worker den Abschluss der Aufgabe an Amazon SWF meldet und die Ergebnisse (falls vorhanden) zur Verfügung stellt. Es gibt jedoch Anwendungsfälle, in denen die Aktivitätsaufgabe bei der Rückkehr aus der Aktivitätsmethode nicht als abgeschlossen gekennzeichnet werden soll. Dies ist besonders hilfreich, wenn Sie menschliche Aufgaben modellieren. Beispielsweise kann die Aktivitätsmethode eine E-Mail an eine Person senden, die eine Aufgabe erledigen muss, bevor die Aktivitätsaufgabe abgeschlossen ist. In solchen Fällen können Sie die Aktivitätsmethode mit der @ManualActivityCompletion-Annotation definieren, um dem Aktivitäts-Worker mitzuteilen, dass er die Aktivität nicht automatisch abschließen soll. Um die Aktivität manuell abzuschließen, können Sie entweder das vonManualActivityCompletionClientim Framework zur Verfügung gestellt oder verwenden Sie dieRespondActivityTaskCompleted-Methode auf dem Amazon SWF Java-Client, der im Amazon SWF SDK bereitgestellt wird. Weitere Details finden Sie in der AWS SDK for Java-Dokumentation.

Um die Aktivitätsaufgabe abzuschließen, müssen Sie ein Aufgaben-Token bereitstellen. Das Aufgaben-Token wird von Amazon SWF verwendet, um Aufgaben eindeutig zu identifizieren. In Ihrer Aktivitätsimplementierung können Sie über ActivityExecutionContext auf das Token zugreifen. Sie müssen dieses Token an denjenigen übergeben, der für die Erledigung der Aufgabe verantwortlich ist. Das Token kann durch den Aufruf von ActivityExecutionContextProvider.getActivityExecutionContext().getTaskToken() von ActivityExecutionContext abgerufen werden.

Die getName-Aktivität des HelloWorld-Beispiels kann implementiert werden, um eine E-Mail mit der Bitte um eine Begrüßungsnachricht an jemanden zu senden:

@ManualActivityCompletion @Override public String getName() throws InterruptedException { ActivityExecutionContext executionContext = contextProvider.getActivityExecutionContext(); String taskToken = executionContext.getTaskToken(); sendEmail("abc@xyz.com", "Please provide a name for the greeting message and close task with token: " + taskToken); return "This will not be returned to the caller"; }

Der folgende Code kann verwendet werden, um die Begrüßung bereitzustellen und die Aufgabe mit ManualActivityCompletionClient zu schließen. Alternativ können Sie die Aufgabe auch fehlschlagen lassen:

public class CompleteActivityTask { public void completeGetNameActivity(String taskToken) { AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(...); // use AWS access keys ManualActivityCompletionClientFactory manualCompletionClientFactory = new ManualActivityCompletionClientFactoryImpl(swfClient); ManualActivityCompletionClient manualCompletionClient = manualCompletionClientFactory.getClient(taskToken); String result = "Hello World!"; manualCompletionClient.complete(result); } public void failGetNameActivity(String taskToken, Throwable failure) { AmazonSimpleWorkflow swfClient = new AmazonSimpleWorkflowClient(...); // use AWS access keys ManualActivityCompletionClientFactory manualCompletionClientFactory = new ManualActivityCompletionClientFactoryImpl(swfClient); ManualActivityCompletionClient manualCompletionClient = manualCompletionClientFactory.getClient(taskToken); manualCompletionClient.fail(failure); } }