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

HelloWorldWorkflow Anwendung

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

Konventionelle und Amazon SWF-Workflow-Anwendungen
HelloWorld Amazon SWF-Workflow
Wird lokal als einzelner Prozess ausgeführt. Wird als mehrere Prozesse ausgeführt, die auf mehrere Systeme verteilt werden können, darunter Amazon EC2-Instances, private Rechenzentren, Client-Computer 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 Aktivitäts-Workern mithilfe von HTTP-Anfragen, wobei Amazon SWF als Zwischengeschaltet 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 Zwischengeschaltet 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. AWS Flow Framework für Java und Amazon SWF übernehmen all diese Details, sodass Sie sich auf die Implementierung der Geschäftslogik konzentrieren können.

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

Konventionelle Versionen und Amazon SWF-Versionen von Hello World!

HelloWorld wird als einzelner Prozess ausgeführt und der Starter, der Workflow-Worker und der Aktivitäts-Worker interagieren mithilfe herkömmlicher Methodenaufrufe. Mit sind der Starter, HelloWorldWorkflowder Workflow-Worker und der Aktivitäts-Worker verteilte Komponenten, die über Amazon SWF mithilfe von HTTP-Anfragen interagieren. Amazon SWF verwaltet die Interaktion, indem es Listen von Workflow- und Aktivitätsaufgaben verwaltet, die es an die jeweiligen Komponenten sendet. In diesem Abschnitt wird beschrieben, wie das Framework für funktioniert HelloWorldWorkflow.

HelloWorldWorkflow wird mithilfe der AWS Flow Framework für 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 wie für verwenden HelloWorld, das bereits für AWS Flow Framework für Java-Anwendungen konfiguriert ist. Um die Anwendung auszuführen, müssen Sie jedoch wie folgt ein Amazon SWF-Konto einrichten:

  • Melden Sie sich für ein - AWS Konto bei Amazon Web Services an, falls Sie noch kein Konto haben.

  • Weisen Sie den Umgebungsvariablen AWS_ACCESS_KEY_ID und AWS_SECRET_KEY die Zugriffs-ID und die geheime ID Ihres Kontos 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.

  • Registrieren Sie sich für das Amazon SWF-Konto unter Amazon Simple Workflow Service .

  • Melden Sie sich bei der an AWS Management Console 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, aber die Anleitungen verwenden „helloWorldWalkthrough“.

Um zu implementieren HelloWorldWorkflow, erstellen Sie eine Kopie des helloWorldHelloWorld -Pakets in Ihrem Projektverzeichnis und benennen Sie es helloWorldHelloWorldWorkflow. In den folgenden Abschnitten wird beschrieben, wie Sie den ursprünglichen HelloWorld Code ändern, um die AWS Flow Framework für Java zu verwenden und als Amazon SWF-Workflow-Anwendung auszuführen.

HelloWorldWorkflow Aktivitäts-Worker

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

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

  • Eine -ActivityWorkerKlasse 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 GreeterActivitiesAktivitätsschnittstelle in 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 nicht unbedingt erforderlich HelloWorld, aber sie gilt für eine AWS Flow Framework für Java-Anwendung. Beachten Sie, dass sich die Schnittstellendefinition selbst nicht geändert hat. Sie müssen jedoch zwei AWS Flow Framework für Java-Anmerkungen, @ActivityRegistrationOptions und @Aktivität, auf die Schnittstellendefinition anwenden. Die Anmerkungen stellen Konfigurationsinformationen bereit und weisen den AWS Flow Framework für Java-Anmerkungsprozessor an, die Schnittstellendefinition zu verwenden, um eine Aktivitäts-Client-Klasse zu generieren, die später erörtert wird.

@ActivityRegistrationOptions hat mehrere benannte Werte, die verwendet werden, um das Verhalten der Aktivitäten zu konfigurieren. 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 in GreeterActivitiesImplwie folgt:

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 einen bestimmten 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-Worker

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 GreeterWorkflowwie 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 für Java-Anwendung nicht unbedingt erforderlich, ist HelloWorld aber für eine AWS Flow Framework für Java-Anwendung unerlässlich. Sie müssen zwei AWS Flow Framework für Java-Anmerkungen, @Workflow und @WorkflowRegistrationOptions, auf die Workflow-Schnittstellendefinition anwenden. Die Anmerkungen stellen Konfigurationsinformationen bereit und weisen auch den AWS Flow Framework für Java-Anmerkungsprozessor an, eine Workflow-Client-Klasse basierend auf der Schnittstelle zu generieren, wie später beschrieben.

@Workflow hat einen optionalen Parameter, dataConverter, der häufig mit seinem Standardwert verwendet wird NullDataConverter, was angibt, dass verwendet werden JsonDataConverter soll.

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

Die GreeterWorkflow Schnittstellendefinition unterscheidet sich HelloWorld in einer wichtigen Weise von , der @ExecuteAnmerkung. 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 keine Namen- oder Parameterliste für Workflow-Schnittstellenmethoden an. Sie verwenden eine Name- und Parameterliste, die für Ihren Workflow geeignet ist, und wenden eine AWS Flow Framework für Java-Anmerkung an, 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 in GreeterWorkflowImplwie folgt:

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 ist ähnlich wie 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, sodass die Workflow-Topologie implementieren GreeterWorkflowImpl kann, indem einfach eine Instance von erstelltGreeterActivitiesImpl, die Methoden der Reihe nach aufgerufen und die Rückgabewerte von einer Aktivität an die nächste übergeben werden. Bei einem Amazon SWF-Workflow wird die Aufgabe einer Aktivität immer noch von einer Aktivitätsmethode von ausgeführtGreeterActivitiesImpl. 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.

Promise <T> Type

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 für Java müssen Sie keinen speziellen Modellierungscode verwenden, um selbst komplexe Topologien zu definieren, sondern nur die Standard-Java-Flow-Steuerung und Promise<T>. Ein Beispiel für die Implementierung einer einfachen parallelen Topologie finden Sie unter HelloWorldWorkflowParallel-Aktivitätsauftragnehmer.

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

HelloWorldWorkflow Implementierung von Workflow und Aktivitäten

Den Implementierungen für Workflow und Aktivitäten sind Worker-Klassen ActivityWorker und zugeordnetWorkflowWorker. Sie übernehmen die Kommunikation zwischen Amazon SWF und den Aktivitäten und Workflow-Implementierungen, indem sie die entsprechende Amazon SWF-Aufgabenliste für Aufgaben abfragen, die entsprechende Methode für jede Aufgabe ausführen und den Datenfluss verwalten. Details hierzu finden Sie unter AWS Flow FrameworkGrundbegriffe: 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 mit 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-Anwendung. Der Einfachheit HelloWorldWorkflow halber implementiert 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(); } }

GreeterWorker hat kein HelloWorld Gegenstück, daher müssen Sie dem Projekt eine Java-Klasse GreeterWorker mit 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 ein 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 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 zur Darstellung des Workflows und übergibt die ClientConfiguration Objekte BasicAWSCredentials und an den Konstruktor.

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

Der Einfachheit halber definiert GreeterWorker zwei String-Konstanten.

  • domain ist der Amazon SWF-Domänenname des Workflows, den Sie bei der Einrichtung Ihres Amazon SWF-Kontos erstellt haben. HelloWorldWorkflow geht davon aus, dass Sie den Workflow in der „helloWorldWalkthrough“-Domäne ausführen.

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

GreeterWorker verwendet die Zeichenfolgenkonstanten und das -AmazonSimpleWorkflowClientObjekt, 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, die ihre jeweiligen Aufgabenlisten abfragen. Um dies zu überprüfen, führen Sie ausGreeterWorker, navigieren Sie zur Amazon SWF-Konsole und wählen Sie helloWorldWalkthrough aus der Liste der Domains 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 Starter

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 seinen Verlauf und seinen Ausführungsstatus anzeigen 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 er einfach „ClientExternalFactoryImpl“ an den Namen der Workflow-Schnittstelle anfügt.

  2. Erstellen Sie ein externes Clientobjekt, indem Sie die getClient Methode des Factory-Objekts aufrufen, die den Objektnamen erstellt, indem sie „ClientExternal“ an den Namen der Workflow-Schnittstelle anfügt. Sie können optional getClient eine Zeichenfolge übergeben, die Amazon SWF verwendet, um diese Instance des Workflows zu identifizieren. Andernfalls stellt Amazon SWF eine Workflow-Instance mithilfe einer generierten GUID dar.

Der von der Factory zurückgegebene Client erstellt nur Workflows, die mit der Zeichenfolge benannt sind, die an die getClient-Methode übergeben wird (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. Sie sollten jetzt someID in der Liste der aktiven Workflow-Ausführungen der Amazon SWF-Konsole sehen:

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.

  • DecisionTaskScheduled gibt 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 Workflow-Ereignisse abschließen

Sie können einzelne Ereignisse auswählen, um weitere Informationen zu erhalten. Zu dem Zeitpunkt, zu dem Sie fertig sind, sollte der Workflow „Hello World!“ gedruckt haben. in Ihre -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 Ausführungs-ID für verschiedene Workflow-Instances verwenden – jedoch immer nur für jeweils eine aktive Ausführung.