HelloWorldWorkflowAsync-Anwendung - 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.

HelloWorldWorkflowAsync-Anwendung

Gelegentlich ist es vorteilhaft, einen Workflow bestimmte Aufgaben lokal durchführt zu lassen, statt eine Aktivität zu verwenden. Jedoch umfassen Workflow-Aufgaben häufig die Verarbeitung der Werte, die von Promise<T>-Objekten repräsentiert werden. Wenn Sie ein Promise<T>-Objekt an eine synchrone Workflow-Methode weiterleiten, wird die Methode sofort ausgeführt, aber sie kann nicht auf den Wert des Promise<T>-Objekts zugreifen, bevor das Objekt bereit ist. Sie könnten Promise<T>.isReady abfragen, bis es true zurückgibt, dies ist jedoch ineffizient und die Methode könnte lange blockiert sein. Eine besserer Ansatz ist das Verwenden einer asynchronen Methode.

Eine asynchrone Methode wird ähnlich wie eine Standardmethode implementiert - oft als Mitglied der Workflow-Implementierungsklasse - und läuft im Kontext der Workflow-Implementierung. Sie legen sie als asynchrone Methode fest, indem Sie eine @Asynchronous-Anmerkung anwenden, wodurch das Framework angewiesen wird, sie ähnlich wie eine Aktivität zu behandeln.

  • Wenn eine Workflow-Implementierung eine asynchrone Methode aufruft, wird sie sofort zurückgegeben. Asynchrone Methoden geben in der Regel ein Promise<T>-Objekt zurück, das verfügbar wird, wenn die Methode abgeschlossen ist.

  • Wenn Sie einer asynchronen Methode eine oder mehrere Promise<T>-Objekte übergeben, verschiebt sie die Ausführung, bis alle Eingabeobjekte bereit sind. Eine asynchrone Methode kann daher auf ihre Promise<T>-Werte der Eingabe zugreifen, ohne eine Ausnahme zu riskieren.

Anmerkung

Wegen der Art und Weise, wie derAWS Flow FrameworkWegen Java führt den Workflow aus, werden asynchrone Methoden in der Regel mehrfach ausgeführt. Daher sollten Sie sie nur für schnelle Aufgaben mit geringem Overhead verwenden. Aktivitäten sollten Sie zur Durchführung zeitintensiver Aufgaben wie großen Berechnungen verwenden. Details hierzu finden Sie unter AWS Flow FrameworkGrundkonzepte: Verteilte Ausführung .

Dieses Thema ist ein Leitfaden für HelloWorldWorkflowAsync, einer geänderten Version von HelloWorldWorkflow, die eine der Aktivitäten mit einer asynchronen Methode ersetzt. Um die Anwendung zu implementieren, erstellen Sie eine Kopie des helloWorld.HelloWorldWorkflow-Pakets in Ihrem Projektverzeichnis und nennen Sie sie helloWorld.HelloWorldWorkflowAsync.

Anmerkung

Dieses Thema baut auf den Konzepten und Dateien auf, die in den Themen HelloWorld-Anwendung und HelloWorldWorkflow Anwendung vorgestellt werden. Machen Sie sich mit den Dateien und vorgestellten Konzepten finden Sie in diesen Themen, bevor Sie fortfahren.

Die folgenden Abschnitte beschreiben die Änderung des ursprünglichen HelloWorldWorkflow-Codes, um eine asynchrone Methode zu verwenden.

HelloWorldWorkflowAsync-Implementierung der Aktivitäten

HelloWorldWorkflowAsync implementiert seine Aktivitäten-Worker-Schnittstelle in GreeterActivities wie folgt:

import com.amazonaws.services.simpleworkflow.flow.annotations.Activities; import com.amazonaws.services.simpleworkflow.flow.annotations.ActivityRegistrationOptions; @Activities(version="2.0") @ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 10) public interface GreeterActivities { public String getName(); public void say(String what); }

Diese Schnittstelle ähnelt derjenigen, die von HelloWorldWorkflow verwendet wird, allerdings mit folgenden Ausnahmen:

  • Sie lässt die getGreeting-Aktivität weg. Diese Aufgabe wird jetzt von einer asynchronen Methode verarbeitet.

  • Die Versionsnummer wird auf 2.0. Nachdem Sie eine Activitivitenschnittstelle bei Amazon SWF registriert haben, können Sie diese nicht mehr ändern, außer Sie ändern die Versionsnummer.

Die verbleibenden Implementierungen der Aktivitätsmethode sind identisch mit HelloWorldWorkflow. Löschen Sie einfach getGreeting aus GreeterActivitiesImpl.

HelloWorldWorkflowAsync-Implementierung des Workflows

HelloWorldWorkflowAsync definiert die Workflow-Schnittstelle wie folgt:

import com.amazonaws.services.simpleworkflow.flow.annotations.Execute; import com.amazonaws.services.simpleworkflow.flow.annotations.Workflow; import com.amazonaws.services.simpleworkflow.flow.annotations.WorkflowRegistrationOptions; @Workflow @WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 3600) public interface GreeterWorkflow { @Execute(version = "2.0") public void greet(); }

Die Schnittstelle ist identisch mit HelloWorldWorkflow, mit Ausnahme einer neuen Versionsnummer. Wenn Sie einen registrierten Workflow ändern möchten, müssen Sie wie bei Aktivitäten seine Version ändern.

HelloWorldWorkflowAsync implementiert den Workflow wie folgt:

import com.amazonaws.services.simpleworkflow.flow.annotations.Asynchronous; import com.amazonaws.services.simpleworkflow.flow.core.Promise; public class GreeterWorkflowImpl implements GreeterWorkflow { private GreeterActivitiesClient operations = new GreeterActivitiesClientImpl(); @Override public void greet() { Promise<String> name = operations.getName(); Promise<String> greeting = getGreeting(name); operations.say(greeting); } @Asynchronous private Promise<String> getGreeting(Promise<String> name) { String returnString = "Hello " + name.get() + "!"; return Promise.asPromise(returnString); } }

HelloWorldWorkflowAsync ersetzt die getGreeting-Aktivität mit einer getGreeting-asynchronen Methode, aber die greet-Methode funktioniert ähnlich:

  1. Führen Sie die getName-Aktivität aus, die sofort ein Promise<String>-Objekt, name, zurückgibt, das den Namen repräsentiert.

  2. Rufen Sie die asynchrone Methode getGreeting auf und übergeben Sie ihr das name-Objekt. getGreeting gibt umgehend ein Promise<String>-Objekt, greeting, zurück, das die Begrüßung repräsentiert.

  3. Führen Sie die say-Aktivität aus und übergeben Sie ihr das greeting-Objekt.

  4. Wenn getName abgeschlossen wird, ist name einsatzbereit und getGreeting verwendet seinen Wert zur Erstellung der Begrüßung.

  5. Wenn getGreeting abgeschlossen wird, ist greeting einsatzbereit und say gibt die Zeichenfolge in der Konsole aus.

Der Unterschied liegt darin, dass Greet (Gruß) nicht den Aktivitäten-Client aufruft, um eine getGreeting-Aktivität auszuführen, sondern die asynchrone getGreeting-Methode. Das Endergebnis ist dasselbe, aber die getGreeting-Methode funktioniert etwas anders als die getGreeting-Aktivität.

  • Der Workflow-Worker verwendet Aufrufsemantiken der Standardfunktion für die Ausführung von getGreeting. Die asynchrone Ausführung der Aktivität wird jedoch von Amazon SWF vermittelt.

  • getGreeting wird im Prozess der Workflow-Implementierung ausgeführt.

  • getGreeting gibt ein Promise<String>-Objekt anstelle eines String-Objekts zurück. Um den Zeichenfolgewert abzurufen, der sich im Besitz von Promise befindet, rufen Sie seine get()-Methode auf. Da die Aktivität jedoch asynchron ausgeführt wird, ist ihr Rückgabewert möglicherweise nicht sofort betriebsbereit. get() löst eine Ausnahme aus, bis der Rückgabewert der asynchronen Methode verfügbar ist.

    Weitere Informationen zur Funktionsweise von Promise finden Sie unter AWS Flow FrameworkGrundkonzepte: Datenaustausch zwischen Aktivitäten und Workflows .

getGreeting erstellt einen Rückgabewert, indem die Begrüßungszeichenfolge an die statische Promise.asPromise-Methode übergeben wird. Diese Methode erstellt ein Promise<T>-Objekt des entsprechenden Typs, legt den Wert fest und versetzt es in den betriebsbereiten Zustand.

HelloWorldWorkflowAsync-Workflow und Aktivitäten-Host und -Starter

HelloWorldWorkflowAsync implementiert GreeterWorker als Host-Klasse für den Workflow und die Implementierungen der Aktivität. Es ist identisch zur HelloWorldWorkflow-Implementierung, mit Ausnahme des taskListToPoll-Namens, der auf "HelloWorldAsyncList" festgelegt ist.

import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient; import com.amazonaws.services.simpleworkflow.flow.ActivityWorker; import com.amazonaws.services.simpleworkflow.flow.WorkflowWorker; public class GreeterWorker { public static void main(String[] args) throws Exception { ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000); String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID"); String swfSecretKey = System.getenv("AWS_SECRET_KEY"); AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey); AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config); service.setEndpoint("https://swf.us-east-1.amazonaws.com"); String domain = "helloWorldWalkthrough"; String taskListToPoll = "HelloWorldAsyncList"; ActivityWorker aw = new ActivityWorker(service, domain, taskListToPoll); aw.addActivitiesImplementation(new GreeterActivitiesImpl()); aw.start(); WorkflowWorker wfw = new WorkflowWorker(service, domain, taskListToPoll); wfw.addWorkflowImplementationType(GreeterWorkflowImpl.class); wfw.start(); } }

HelloWorldWorkflowAsync implementiert den Workflow-Starter in GreeterMain. Es ist identisch zur HelloWorldWorkflow-Implementierung.

Führen Sie zur Ausführung des Workflows GreeterWorker und GreeterMain genau wie bei HelloWorldWorkflow aus.