View a markdown version of this page

HelloWorldWorkflow Bewerbung - 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.

HelloWorldWorkflow Bewerbung

Obwohl das grundlegende HelloWorld Beispiel wie ein Workflow strukturiert ist, unterscheidet es sich in mehreren wichtigen Punkten von einem Amazon SWF-Workflow:

Konventionelle und Amazon SWF-Workflow-Anwendungen
HelloWorld Amazon SWF-Arbeitsablauf
Wird lokal als einzelner Prozess ausgeführt. Wird als mehrere Prozesse ausgeführt, die auf mehrere Systeme verteilt werden können, einschließlich Amazon EC2-Instances, privaten Rechenzentren, Client-Computern usw. Es muss nicht einmal das gleiche Betriebssystem verwendet werden.
Aktivitäten sind synchrone Methoden, die bis zu ihrem Abschluss für eine Blockierung sorgen. Aktivitäten werden durch asynchrone Methoden abgebildet. Diese geben die Kontrolle sofort zurück. Sie ermöglichen es dem Workflow, während der Wartezeit auf den Abschluss der Aktivität andere Aufgaben auszuführen.
Der Workflow-Worker interagiert mit einem Aktivitäts-Worker, indem er die entsprechende Methode aufruft. Workflow-Worker interagieren mit Workflow-Workern mithilfe von HTTP-Anfragen, wobei Amazon SWF als Vermittler fungiert.
Der Workflow-Starter interagiert mit dem Workflow-Worker, indem er die entsprechende Methode aufruft. Workflow-Starter interagieren mit Workflow-Workern mithilfe von HTTP-Anfragen, wobei Amazon SWF als Vermittler fungiert.

Sie können eine verteilte, asynchrone Workflow-Anwendung von Grund auf neu implementieren, indem Sie beispielsweise Ihren Workflow-Worker direkt über Webservice-Aufrufe mit einem Aktivitäts-Worker interagieren lassen. Allerdings müssen Sie dann den gesamten, komplizierten Code implementieren, der für die asynchrone Ausführung mehrerer Aktivitäten, den Datenfluss usw. erforderlich ist. The AWS Flow Framework for Java und Amazon SWF kümmern sich um all diese Details, sodass Sie sich auf die Implementierung der Geschäftslogik konzentrieren können.

HelloWorldWorkflow ist eine modifizierte Version davon HelloWorld , die als Amazon SWF-Workflow ausgeführt wird. Die folgende Abbildung fasst die Funktionsweise der beiden Anwendungen zusammen.

Konventionelle und Amazon SWF-Versionen von Hello World!

HelloWorld wird als ein einziger Prozess ausgeführt, und der Starter, der Workflow-Worker und der Aktivitäten-Worker interagieren mithilfe herkömmlicher Methodenaufrufe. Bei StarterHelloWorldWorkflow, Workflow-Worker und Aktivitäten-Worker handelt es sich um verteilte Komponenten, die mithilfe von HTTP-Anfragen über Amazon SWF interagieren. Amazon SWF verwaltet die Interaktion, indem es Listen mit Workflow- und Aktivitätsaufgaben verwaltet, die es an die jeweiligen Komponenten weiterleitet. In diesem Abschnitt wird beschrieben, wie das Framework für HelloWorldWorkflow funktioniert.

HelloWorldWorkflow wird mithilfe der AWS Flow Framework for Java-API implementiert, die die manchmal komplizierten Details der Interaktion mit Amazon SWF im Hintergrund verarbeitet und den Entwicklungsprozess erheblich vereinfacht. Sie können dasselbe Projekt verwenden, das Sie bereits AWS Flow Framework für HelloWorld Java-Anwendungen konfiguriert haben. Um die Anwendung auszuführen, müssen Sie jedoch wie folgt ein Amazon SWF-Konto einrichten:

  • Eröffnen Sie ein AWS Konto bei Amazon Web Services, falls Sie noch keines haben.

  • Weisen Sie die Zugriffs-ID und die geheime ID Ihres Kontos den AWS_ACCESS_KEY_ID Umgebungsvariablen bzw. den AWS_SECRET_KEY Umgebungsvariablen zu. Die Schlüsselwerte selbst sollten nicht in Ihrem Code enthalten sein. Die Speicherung in Umgebungsvariablen ist ein bequemer Weg, um das Problem zu lösen.

  • Melden Sie sich bei Amazon Simple Workflow Service für ein Amazon SWF-Konto an.

  • Melden Sie sich bei dem an AWS-Managementkonsole und wählen Sie den Amazon SWF-Service aus.

  • Wählen Sie in der oberen rechten Ecke Domains verwalten und registrieren Sie eine neue Amazon SWF-Domain. Ein Domäne ist ein logischer Container für Ihre Anwendungsressourcen (z. B. Workflow- und Aktivitätstypen und Workflow-Ausführungen). Sie können jeden beliebigen Domainnamen verwenden, in den Anleitungen wird jedoch „HalloWorldWalkthrough“ verwendet.

Um das zu implementieren HelloWorldWorkflow, erstellen Sie eine Kopie des World.HelloWorld Hello-Pakets in Ihrem Projektverzeichnis und nennen Sie es hello. World.HelloWorldWorkflow In den folgenden Abschnitten wird beschrieben, wie Sie den HelloWorld Originalcode so ändern, dass er AWS Flow Framework für Java verwendet und als Amazon SWF-Workflow-Anwendung ausgeführt wird.

HelloWorldWorkflow Aktivitäten: Mitarbeiter

HelloWorld implementierte seine Aktivitäten Worker als eine einzige Klasse. Ein Worker AWS Flow Framework für Java-Aktivitäten besteht aus drei grundlegenden Komponenten:

  • Die Aktivitätsmethoden, die die eigentlichen Aufgaben ausführen, werden in einer Schnittstelle definiert und in einer verwandten Klasse implementiert.

  • Eine ActivityWorker Klasse verwaltet die Interaktion zwischen den Aktivitätsmethoden und Amazon SWF.

  • Eine Aktivitäts-Host-Anwendung, die den Aktivitäts-Worker registriert und startet und die Bereinigung übernimmt.

Dieser Abschnitt behandelt die Aktivitätsmethoden. Die beiden anderen Klassen werden später besprochen.

HelloWorldWorkflow definiert die Aktivitätenschnittstelle in GreeterActivities wie folgt:

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

Diese Schnittstelle war für eine Java-Anwendung nicht unbedingt erforderlich HelloWorld, ist aber AWS Flow Framework für eine Java-Anwendung vorgesehen. Beachten Sie, dass sich die Schnittstellendefinition selbst nicht geändert hat. Sie müssen jedoch zwei AWS Flow Framework für Java-Annotationen @ActivityRegistrationOptions und @Aktivität für die Schnittstellendefinition anwenden. Die Anmerkungen enthalten Konfigurationsinformationen und weisen den Java-Annotationsprozessor an, anhand der Schnittstellendefinition eine Clientklasse AWS Flow Framework für Aktivitäten zu generieren, auf die später eingegangen wird.

@ActivityRegistrationOptionshat mehrere benannte Werte, die zur Konfiguration des Verhaltens der Aktivitäten verwendet werden. HelloWorldWorkflow gibt zwei Timeouts an:

  • defaultTaskScheduleToStartTimeoutSeconds definiert, wie lange sich die Aufgaben in der Aktivitätsaufgabenliste in der Warteschlange befinden können. Der Wert ist auf 300 Sekunden (5 Minuten) festgelegt.

  • defaultTaskStartToCloseTimeoutSeconds definiert die maximale Zeit, die die Aktivität zur Ausführung der Aufgabe nutzen kann. Der Wert ist auf 10 Sekunden festgelegt.

Diese Timeouts stellen sicher, dass die Aktivität ihre Aufgabe in angemessener Zeit abschließt. Wird ein Timeout überschritten, generiert das Framework einen Fehler und der Workflow-Worker muss entscheiden, wie das Problem behandelt werden soll. Wie man mit solchen Fehlern umgeht, erfahren Sie unter Fehlerbehandlung.

@Activities hat mehrere Werte. In der Regel wird jedoch nur die Versionsnummer der Aktivität definiert. So können Sie verschiedene Generationen der Aktivitätsimplementierungen nachverfolgen. Wenn Sie eine Aktivitätsschnittstelle ändern, nachdem Sie sie bei Amazon SWF registriert haben, einschließlich der Änderung der @ActivityRegistrationOptions Werte, müssen Sie eine neue Versionsnummer verwenden.

HelloWorldWorkflow implementiert die Aktivitätsmethoden wie folgt inGreeterActivitiesImpl:

public class GreeterActivitiesImpl implements GreeterActivities { @Override public String getName() { return "World"; } @Override public String getGreeting(String name) { return "Hello " + name; } @Override public void say(String what) { System.out.println(what); } }

Beachten Sie, dass der Code mit der HelloWorld Implementierung identisch ist. Im Kern ist eine AWS Flow Framework Aktivität nur eine Methode, die Code ausführt und möglicherweise ein Ergebnis zurückgibt. Der Unterschied zwischen einer Standardanwendung und einer Amazon SWF-Workflow-Anwendung besteht darin, wie der Workflow die Aktivitäten ausführt, wo die Aktivitäten ausgeführt werden und wie die Ergebnisse an den Workflow-Worker zurückgegeben werden.

HelloWorldWorkflow Workflow-Mitarbeiter

Ein Amazon SWF-Workflow-Worker besteht aus drei grundlegenden Komponenten.

  • Eine Workflow-Implementierung. Dies ist eine Klasse, die die Workflow-bezogenen Aufgaben ausführt.

  • Eine Activities-Client. Diese ist im Wesentlichen ein Proxy für die Aktivitätsklasse und wird von einer Workflow-Implementierung verwendet, um Aktivitätsmethoden asynchron auszuführen.

  • Eine WorkflowWorker Klasse, die die Interaktion zwischen dem Workflow und Amazon SWF verwaltet.

Dieser Abschnitt beschreibt die Workflow-Implementierung und den Activities-Client. Die WorkflowWorker-Klasse wird später besprochen.

HelloWorldWorkflow definiert die Workflow-Schnittstelle in GreeterWorkflow 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 = "1.0") public void greet(); }

Diese Schnittstelle ist auch für eine Java-Anwendung nicht unbedingt erforderlich, HelloWorld aber AWS Flow Framework für sie unerlässlich. Sie müssen zwei AWS Flow Framework für Java-Annotationen @Workflow und @WorkflowRegistrationOptions für die Workflow-Schnittstellendefinition anwenden. Die Anmerkungen enthalten Konfigurationsinformationen und weisen den AWS Flow Framework Java-Annotationsprozessor außerdem an, eine Workflow-Clientklasse auf der Grundlage der Schnittstelle zu generieren, wie später beschrieben.

@Workflowhat einen optionalen Parameter, DataConverter, der häufig mit seinem Standardwert verwendet wird, der angibt NullDataConverter, dass JsonDataConverter er verwendet werden sollte.

@WorkflowRegistrationOptions hat außerdem eine Reihe von optionalen Parametern, die zur Konfiguration des Workflow-Workers verwendet werden können. Hier setzen wir defaultExecutionStartToCloseTimeoutSeconds — was angibt, wie lange der Workflow ausgeführt werden kann — auf 3600 Sekunden (1 Stunde).

Die GreeterWorkflow Schnittstellendefinition unterscheidet sich HelloWorld in einem wichtigen Punkt von der Anmerkung. @Execute Workflow-Schnittstellen legen die Methoden fest, die von Anwendungen wie dem Workflow-Starter aufgerufen werden können. Sie sind auf eine Handvoll Methoden mit jeweils einer bestimmten Rolle beschränkt. Das Framework gibt keinen Namen oder keine Parameterliste für Workflow-Schnittstellenmethoden an. Sie verwenden einen Namen und eine Parameterliste, die für Ihren Workflow geeignet sind, und verwenden eine AWS Flow Framework For-Java-Annotation, um die Rolle der Methode zu identifizieren.

@Execute hat zwei Aufgaben:

  • Es legt greet als Einstiegspunkt des Workflows fest (die Methode, die der Workflow-Starter aufruft, um den Workflow zu starten). Im Allgemeinen kann ein Einstiegspunkt einen oder mehrere Parameter entgegennehmen. Diese ermöglichen es dem Starter, den Workflow zu initialisieren. Das aktuelle Beispiel erfordert jedoch keine Initialisierung.

  • Es legt die Versionsnummer des Workflows fest, über die Sie verschiedene Generationen von Workflow-Implementierungen nachverfolgen können. Um eine Workflow-Schnittstelle zu ändern, nachdem Sie sie bei Amazon SWF registriert haben, einschließlich der Änderung der Timeout-Werte, müssen Sie eine neue Versionsnummer verwenden.

Informationen zu den anderen Methoden, die in eine Workflow-Schnittstelle eingebunden werden können, finden Sie unter Workflow- und Aktivitäts-Verträge.

HelloWorldWorkflow implementiert den Workflow wie folgt inGreeterWorkflowImpl:

import com.amazonaws.services.simpleworkflow.flow.core.Promise; public class GreeterWorkflowImpl implements GreeterWorkflow { private GreeterActivitiesClient operations = new GreeterActivitiesClientImpl(); public void greet() { Promise<String> name = operations.getName(); Promise<String> greeting = operations.getGreeting(name); operations.say(greeting); } }

Der Code ähnelt HelloWorld, weist jedoch zwei wichtige Unterschiede auf.

  • GreeterWorkflowImpl erzeugt eine Instanz von GreeterActivitiesClientImpl (dem Activities-Client) statt von GreeterActivitiesImpl, und führt Aktivitäten durch den Aufruf von Methoden für das Client-Objekt aus.

  • Der Name und Greeting-Aktivitäten geben Promise<String>-Objekte statt String-Objekte zurück.

HelloWorld ist eine Standard-Java-Anwendung, die lokal als einzelner Prozess ausgeführt wird. GreeterWorkflowImpl Sie kann also die Workflow-Topologie implementieren, indem Sie einfach eine Instanz von erstellenGreeterActivitiesImpl, die Methoden der Reihe nach aufrufen und die Rückgabewerte von einer Aktivität zur nächsten übergeben. Bei einem Amazon SWF-Workflow wird die Aufgabe einer Aktivität immer noch von einer Aktivitätsmethode von GreeterActivitiesImpl ausgeführt. Die Methode wird jedoch nicht notwendigerweise im selben Prozess wie der Workflow ausgeführt. Sie wird möglicherweise nicht einmal auf demselben System ausgeführt. Der Workflow muss die Aktivität außerdem asynchron ausführen. Diese Anforderungen werfen folgende Probleme auf:

  • Wie kann man eine Aktivitätsmethode ausführen, die in einem anderen Prozess oder sogar auf einem anderen System ausgeführt wird?

  • Wie kann man eine Aktivitätsmethode asynchron ausführen?

  • Wie kann man die Übergabe- und Rückgabewerte von Aktivitäten verwaltet? Wenn der Rückgabewert von Aktivität A beispielsweise an Aktivität B übergeben wird, müssen Sie sicherstellen, dass Aktivität B nicht ausgeführt wird, bis Aktivität A abgeschlossen ist.

Sie können mit der vertrauten Java-Flusssteuerung in Kombination mit dem Activities-Client und Promise<T> über den Kontrollfluss der Anwendung eine Vielzahl von Workflow-Topologien implementieren.

Activities-Client

GreeterActivitiesClientImpl ist im Grunde ein Proxy für GreeterActivitiesImpl, der es einer Workflow-Implementierung ermöglicht, die GreeterActivitiesImpl-Methoden asynchron auszuführen.

Die Klassen GreeterActivitiesClient und GreeterActivitiesClientImpl werden anhand der Angaben in den Annotionen Ihrer GreeterActivities-Klasse automatisch generiert. Sie müssen diese nicht selbst implementieren.

Anmerkung

Eclipse generiert die Klassen, wenn Sie Ihr Projekt speichern. Sie können den generierten Code im Unterverzeichnis .apt_generated Ihres Projektverzeichnisses einsehen.

Um Kompilierungsfehler in Ihrer GreeterWorkflowImpl-Klasse zu vermeiden, empfiehlt es sich, das Verzeichnis .apt_generated auf der Registerkarte Order and Export (Reihenfolge und Export) des Dialogfelds Java-Buildpfad nach ganz oben zu verschieben.

Ein Workflow-Worker führt eine Aktivität aus, indem er die entsprechende Client-Methode aufruft. Die Methode arbeitet asynchron. Sie gibt sofort ein Promise<T>-Objekt zurück, wobei T der Rückgabetyp der Aktivität ist. Das zurückgegebene Promise<T>-Objekt ist im Grunde ein Platzhalter für den Wert, den die Aktivitätsmethode zurückgeben kann.

  • Bei der Rückkehr aus der Activities-Client-Methode befindet sich das Promise<T>-Objekt zunächst im Status Unready. Dies bedeutet, dass das Objekt noch keinen gültigen Rückgabewert darstellt.

  • Wenn die entsprechende Aktivitätsmethode ihre Aufgabe abschließt und die Ausführung zurückgibt, weist das Framework dem Promise<T>-Objekt den Rückgabewert zu und versetzt es in den Zustand Ready.

>Typ „Promise < T“

Der Hauptzweck von Promise<T>-Objekten ist die Verwaltung des Datenflusses zwischen asynchronen Komponenten und der Steuerung ihrer Ausführung. Ihre Anwendung muss die Synchronisation nicht explizit verwalten oder von Mechanismen wie Timer nutzen, um sicherzustellen, dass asynchrone Komponenten nicht vorzeitig ausgeführt werden. Wenn Sie eine Activity-Client-Methode aufrufen, gibt sie die Kontrolle sofort zurück. Das Framework verschiebt die Ausführung der entsprechenden Aktivitätsmethode, bis alle übergebenen Promise<T>-Objekte bereit sind und gültige Daten enthalten.

Aus der Sicht von GreeterWorkflowImpl geben alle drei Aktivity-Client-Methoden die Kontrolle sofort zurück. Aus Sicht von GreeterActivitiesImpl ruft das Framework getGreeting erst auf, wenn name abgeschlossen ist. say wird erst aufgerufen, wenn getGreeting abgeschlossen ist.

Durch die Verwendung von Promise<T> zur Übergabe von Daten von einer Aktivität an die nächste, stellt HelloWorldWorkflow nicht nur sicher, dass Aktivitätsmethoden keine ungültigen Daten verwenden, sondern steuert auch, wann die Aktivitäten ausgeführt werden und definiert die Workflow-Topologie. Um den Promise<T>-Rückgabewert jeder Aktivität an die nächste Aktivität zu übergeben, müssen die Aktivitäten nacheinander ausgeführt werden. Dies definiert die zuvor beschriebene lineare Topologie. Mit AWS Flow Framework for Java müssen Sie keinen speziellen Modellierungscode verwenden, um selbst komplexe Topologien zu definieren, nur Standard-Java-Flusskontrolle undPromise<T>. Ein Beispiel für die Implementierung einer einfachen parallelen Topologie finden Sie unter HelloWorldWorkflowParallel Aktivitäten: Arbeiter.

Anmerkung

Wenn eine Aktivitätsmethode wie say keinen Wert zurückgibt, gibt die entsprechende Client-Methode ein Promise<Void>-Objekt zurück. Das Objekt repräsentiert keine Daten. Es hat zunächst den Status "Unready". Es ist erst dann bereit, wenn die Aktivität abgeschlossen ist. Sie können ein Promise<Void>-Objekt an andere Activity-Client-Methoden übergeben. So können Sie sicherzustellen, dass diese die Ausführung bis zum Abschluss der ursprünglichen Aktivität verschieben.

Promise<T> ermöglicht es einer Workflow-Implementierung, die Activity-Client-Methoden und deren Rückgabewerte ähnlich wie bei synchronen Methoden zu verwenden. Sie müssen allerdings beim Zugriff auf den Wert eines Promise<T>-Objekts vorsichtig sein. Im Gegensatz zum Java-Typ Future<T> übernimmt das Framework und nicht die Anwendung die Synchronisation für Promise<T>. Wenn Sie Promise<T>.get aufrufen und das Objekt nicht bereit ist, löst get eine Ausnahme aus. Beachten Sie, dass HelloWorldWorkflow nie direkt auf ein Promise<T>-Objekt zugreift. Es übergibt die Objekte einfach von einer Aktivität zur nächsten. Wenn ein Objekt bereit ist, extrahiert das Framework den Wert und übergibt ihn als Standardtyp an die Aktivitätsmethode.

Auf Promise<T>-Objekte sollte nur über asynchronen Code zugegriffen werden, wobei das Framework gewährleistet, dass das Objekt bereit ist und einen gültigen Wert darstellt. HelloWorldWorkflow löst dieses Problem, indem Promise<T>-Objekte nur an Methoden des Activities-Clients übergeben werden. Sie können in Ihrer Workflow-Implementierung auf den Wert eines Promise<T>-Objekts zugreifen, indem Sie das Objekt an eine asynchrone Workflow-Methode übergeben, die sich wie eine Aktivität verhält. Ein Beispiel finden Sie unter HelloWorldWorkflowAsync Bewerbung.

HelloWorldWorkflow Implementierung von Arbeitsabläufen und Aktivitäten

Den Arbeitsablauf- und Aktivitätenimplementierungen sind Arbeiterklassen zugeordnet, ActivityWorker und WorkflowWorker. Sie sorgen für die Kommunikation zwischen Amazon SWF und den Aktivitäten und Workflow-Implementierungen, indem sie die entsprechende Amazon SWF-Aufgabenliste nach Aufgaben abfragen, für jede Aufgabe die entsprechende Methode ausführen und den Datenfluss verwalten. Details hierzu finden Sie unter AWS Flow Framework Grundlegende Konzepte: Anwendungsstruktur

Um die Aktivitäts- und Workflow-Implementierungen mit den entsprechenden Worker-Objekten zu verknüpfen, implementieren Sie eine oder mehrere Worker-Anwendungen. Diese haben die folgenden Aufgaben:

  • Registrieren Sie Workflows oder Aktivitäten bei Amazon SWF.

  • Erstellen von Worker-Objekten und Zuordnen dieser Objekte zu den Workflow- oder Aktivitäts-Worker-Implementierungen

  • Weisen Sie die Worker-Objekte an, mit der Kommunikation mit Amazon SWF zu beginnen.

Wenn Sie den Workflow und die Aktivitäten als getrennte Prozesse ausführen möchten, müssen Sie separate Workflow- und Aktivitäts-Worker-Hosts implementieren. Ein Beispiel finden Sie unter HelloWorldWorkflowDistributed Bewerbung. HelloWorldWorkflowImplementiert der Einfachheit halber einen einzelnen Worker-Host, der Aktivitäten und Workflow-Worker im selben Prozess ausführt, wie folgt:

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 = "HelloWorldList"; 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(); } }

GreeterWorkerhat kein HelloWorld Gegenstück, daher müssen Sie dem Projekt eine Java-Klasse mit GreeterWorker dem Namen hinzufügen und den Beispielcode in diese Datei kopieren.

Der erste Schritt besteht darin, ein AmazonSimpleWorkflowClient Objekt zu erstellen und zu konfigurieren, das die zugrunde liegenden Amazon SWF-Servicemethoden aufruft. Hierzu geht GreeterWorker folgendermaßen vor:

  1. Erstellt ein ClientConfiguration Objekt und gibt einen Socket-Timeout von 70 Sekunden an. Dieser Wert gibt an, wie lange auf die Übertragung der Daten über eine bestehende offene Verbindung gewartet wird, bevor der Socket geschlossen wird.

  2. Erstellt ein https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/auth/BasicAWSCredentials.html BasicAWSCredentials-Objekt zur Identifizierung des AWS Kontos und übergibt die Kontoschlüssel an den Konstruktor. Zur Vereinfachung und um diese nicht als Klartext im Code zu hinterlegen, werden die Schlüssel als Umgebungsvariablen gespeichert.

  3. Erstellt ein AmazonSimpleWorkflowClient Objekt, das den Arbeitsablauf darstellt, und übergibt die Objekte und an den BasicAWSCredentials Konstruktor. ClientConfiguration

  4. Legt die Service-Endpunkt-URL des Client-Objekts fest. Amazon SWF ist derzeit in allen AWS Regionen verfügbar.

Der Einfachheit halber definiert GreeterWorker zwei String-Konstanten.

  • domainist der Amazon SWF-Domainname des Workflows, den Sie bei der Einrichtung Ihres Amazon SWF-Kontos erstellt haben. HelloWorldWorkflowgeht davon aus, dass Sie den Workflow in der Domäne „HalloWorldWalkthrough“ ausführen.

  • taskListToPollist der Name der Aufgabenlisten, die Amazon SWF verwendet, um die Kommunikation zwischen dem Workflow und den Aktivitäten-Workern zu verwalten. Sie können den Namen auf eine beliebige Zeichenfolge setzen. HelloWorldWorkflow verwendet "HelloWorldList" sowohl für Arbeitsablauf- als auch für Aktivitätsaufgabenlisten. Hinter den Kulissen werden die Namen in verschiedene Namespaces umgesetzt. Daher bleiben beide Aufgabenlisten unterscheidbar.

GreeterWorkerverwendet die Zeichenkettenkonstanten und das AmazonSimpleWorkflowClient Objekt, um Worker-Objekte zu erstellen, die die Interaktion zwischen den Aktivitäten und Worker-Implementierungen und Amazon SWF verwalten. Insbesondere übernehmen die Worker-Objekte die Aufgabe, die entsprechende Aufgabenliste für Aufgaben abzufragen.

GreeterWorker erstellt ein ActivityWorker-Objekt und konfiguriert es so, dass es GreeterActivitiesImpl behandelt, indem es eine neue Klasseninstance hinzufügt. GreeterWorker ruft dann die start-Methode des ActivityWorker-Objekts auf, die das Objekt anweist, mit der Abfrage der angegebenen Aktivitätsaufgabenliste zu beginnen.

GreeterWorker erzeugt ein WorkflowWorker-Objekt und konfiguriert es über das Hinzufügen des Klassen-Dateinamens GreeterWorkflowImpl.class so, dass es GreeterWorkflowImpl nutzt. Es ruft dann die WorkflowWorker-Methode des start-Objekts auf, die das Objekt anweist, die angegebene Workflow-Aufgabenliste abzufragen.

Sie können GreeterWorker nun erfolgreich ausführen. Es registriert den Workflow und die Aktivitäten bei Amazon SWF und startet die Worker-Objekte mit der Abfrage ihrer jeweiligen Aufgabenlisten. Um dies zu überprüfen, starten GreeterWorker Sie die Amazon SWF-Konsole und wählen Sie helloWorldWalkthrough aus der Liste der Domänen aus. Wenn Sie Workflow Types (Workflow-Typen) im Bereich Navigation auswählen, sollten Sie GreeterWorkflow.greet sehen:

HelloWorldWorkflow Workflow-Typ

Wenn Sie Aktivity Types (Aktivitätstypen) auswählen, werden die GreeterActivities-Methoden angezeigt:

HelloWorldWorkflow Aktivitätstypen

Wenn Sie Workflow Executions (Workflow-Ausführungen) auswählen, sehen Sie jedoch keine aktiven Ausführungen. Die Workflow- und Aktivitäts-Worker suchen zwar nach Aufgaben, aber wir haben noch keine Workflow-Ausführung gestartet.

HelloWorldWorkflow Vorspeise

Als letztes muss ein Workflow-Starter implementiert werden – eine Anwendung, die die Workflow-Ausführung startet. Der Ausführungsstatus wird von Amazon SWF gespeichert, sodass Sie den Verlauf und den Ausführungsstatus einsehen können. HelloWorldWorkflow implementiert einen Workflow-Starter, indem die GreeterMain Klasse wie folgt geändert wird:

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; public class GreeterMain { 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"; GreeterWorkflowClientExternalFactory factory = new GreeterWorkflowClientExternalFactoryImpl(service, domain); GreeterWorkflowClientExternal greeter = factory.getClient("someID"); greeter.greet(); } }

GreeterMain erzeugt ein AmazonSimpleWorkflowClient-Objekt mit dem gleichen Code wie GreeterWorker. Es stellt dann ein GreeterWorkflowClientExternal-Objekt, das als Proxy für den Workflow fungiert (ähnlich wie der in GreeterWorkflowClientImpl angelegte Activity-Client als Proxy für die Aktivitätsmethoden agiert). Anstatt ein Workflow-Client-Objekt mit new anzulegen, gehen Sie folgendermaßen vor:

  1. Erstellen Sie ein externes Client-Factory-Objekt und übergeben Sie das AmazonSimpleWorkflowClient Objekt und den Amazon SWF-Domänennamen an den Konstruktor. Das Client-Factory-Objekt wird vom Annotationsprozessor des Frameworks erstellt, der den Objektnamen erstellt, indem einfach "ClientExternalFactoryImpl" an den Namen der Workflow-Schnittstelle angehängt wird.

  2. Erstellen Sie ein externes Client-Objekt, indem Sie die getClient Methode des Factory-Objekts aufrufen, die den Objektnamen erstellt, indem "ClientExternal" an den Namen der Workflow-Schnittstelle angehängt wird. Sie können optional getClient eine Zeichenfolge übergeben, die Amazon SWF verwendet, um diese Instanz des Workflows zu identifizieren. Andernfalls stellt Amazon SWF eine Workflow-Instanz mithilfe einer generierten GUID dar.

Der von der Factory zurückgegebene Client erstellt nur Workflows, die mit der an die https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/simpleworkflow/flow/WorkflowClientFactoryExternal.html#getClient(java.lang.String) getClient-Methode übergebenen Zeichenfolge benannt sind (der von der Factory zurückgegebene Client hat bereits den Status in Amazon SWF). Um einen Workflow mit einer anderen ID auszuführen, müssen Sie zurück zur Factory wechseln und einen neuen Client mit der anderen ID anlegen.

Der Workflow-Client stellt eine greet-Methode zur Verfügung, die GreeterMain aufruft, um den Workflow zu starten (da greet() die mit der @Execute-Annotation angegebene Methode war).

Anmerkung

Der Annotationsprozessor erzeugt außerdem ein internes Client-Factory-Objekt, das zur Erstellung von untergeordneten Workflows verwendet wird. Details hierzu finden Sie unter Untergeordnete Workflow-Ausführungen.

Beenden Sie GreeterWorker (falls noch ausgeführt). Starten Sie GreeterMain. In der Liste der aktiven Workflow-Ausführungen der Amazon SWF-Konsole sollte jetzt someId angezeigt werden:.

HelloWorldWorkflow Workflow-Ausführungen

Wenn Sie someID und die Registerkarte Events (Ereignisse) auswählen, werden die Ereignisse angezeigt:

HelloWorldWorkflow erste Workflow-Ereignisse
Anmerkung

Wenn Sie GreeterWorker bereits früher gestartet haben und es noch ausgeführt wird, sehen Sie eine längere Ereignisliste. Die Gründe hierfür werden gleich besprochen. Halten Sie GreeterWorker an und versuchen Sie erneut, GreaterMain zu starten.

Die Registerkarte Events (Ereignisse) zeigt nur zwei Ereignisse an:

  • WorkflowExecutionStarted zeigt an, dass der Workflow mit der Ausführung begonnen hat.

  • DecisionTaskScheduledgibt an, dass Amazon SWF die erste Entscheidungsaufgabe in die Warteschlange gestellt hat.

Der Grund dafür, dass der Workflow bei der ersten Entscheidungsaufgabe blockiert wird, ist, dass der Workflow auf zwei Anwendungen verteilt ist, GreeterMain und GreeterWorker. GreeterMain die Workflow-Ausführung gestartet haben, aber GreeterWorker nicht läuft, sodass die Worker die Listen nicht abfragen und Aufgaben ausführen. Sie können beide Anwendungen unabhängig voneinander ausführen. Sie benötigen jedoch beide, damit die Workflow-Ausführung über die erste Entscheidungsaufgabe hinausgeht. Wenn Sie nun GreeterWorker ausführen, beginnen die Workflow- und Aktivitäts-Worker mit dem Abrufen und die verschiedenen Aufgaben werden schnell abgeschlossen. Wenn Sie nun die Registerkarte Events prüfen, wird die erste Ereignisgruppe angezeigt.

HelloWorldWorkflow vollständige Workflow-Ereignisse

Sie können einzelne Ereignisse auswählen, um weitere Informationen zu erhalten. Wenn Sie mit der Suche fertig sind, sollte im Workflow „Hello World!“ gedruckt sein auf deine Konsole.

Nach dem Abschluss des Workflows erscheint er nicht mehr in der Liste der aktiven Ausführungen. Wenn Sie dies überprüfen möchten, wählen Sie die Schaltfläche für den Ausführungsstatus Closed (Geschlossen) und dann List Executions (Ausführungen auflisten) aus. Es werden alle abgeschlossenen Workflow-Instances in der angegebenen Domäne (helloWorldWalkthrough) angezeigt (die die beim Anlegen der Domäne angegebene Aufbewahrungszeit nicht überschritten haben).

HelloWorldWorkflow abgeschlossene Workflows

Beachten Sie, dass jede Workflow-Instance einen eindeutigen Run ID-Wert hat. Sie können dieselbe Workflow-ID für verschiedene Workflow-Instanzen verwenden, jedoch jeweils nur für eine aktive Ausführung.