JAVA

HelloWorldWorkflow-Anwendung

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 GrundlegendeHelloWorldBeispiel ist wie ein Workflow aufgebaut. Es unterscheidet sich in mehreren wesentlichen Punkten von einem Amazon SWF SWF-Workflow:

Konventionelle und Amazon SWF SWF-Workflow-Anwendungen HelloWorld Amazon SWF SWF-Workflow Wird lokal als einzelner Prozess ausgeführt. Wir über mehrere Prozesse ausgeführt, die über mehrere Systeme verteilt werden können (einschließlich Amazon EC2 EC2-Instances, private Rechenzentren, Client-Computer und so weiter). 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 über HTTP-Requests mit Aktivitäts-Workern, wobei Amazon SWF als Vermittler fungiert. Der Workflow-Starter interagiert mit dem Workflow-Worker, indem er die entsprechende Methode aufruft. Workflow-Starter interagieren über HTTP-Requests mit Workflow-Workern, 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. DieAWS Flow FrameworkFür Java und Amazon SWF kümmern sich um diese Details. So können Sie sich auf die Implementierung der Geschäftslogik konzentrieren.

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

HelloWorld wird als ein einzelner Prozess ausgeführt. Starter, Workflow-Worker und Aktivitäts-Worker interagieren über konventionelle Methodenaufrufe. mit HelloWorldWorkflow sind der Starter, der Workflow-Worker und der Activities-Worker verteilte Komponenten, die über Amazon SWF interagieren über HTTP-Requests. Amazon SWF verwaltet die Interaktion durch die Pflege von Listen von Workflow- und Activities-Aufgaben, die es an die jeweiligen Komponenten verteilt. Dieser Abschnitt beschreibt, wie das Framework bei HelloWorldWorkflow funktioniert.

HelloWorldWorkflow wird mithilfe derAWS Flow Frameworkfür Java-API, die die manchmal komplizierten Details der Interaktion mit Amazon SWF im Hintergrund behandelt und den Entwicklungsprozess erheblich vereinfacht. Sie können das gleiche Projekt wie für HelloWorld verwenden (das bereits konfiguriert ist)AWS Flow Frameworkfür Java-Anwendungen. Um die Anwendung auszuführen, müssen Sie jedoch ein Amazon SWF SWF-Konto einrichten:

Registrieren für einAWSKonto (sofern noch nicht geschehen)Amazon Web Services aus.

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.

Unter können Sie ein Amazon SWF SWF-Konto registrierenAmazon Simple Workflow Service aus.

Loggen Sie sich imAWS Management Consoleund wählen Sie den Amazon SWF-Service aus.

Klicken Sie aufVerwalten von DomäRegistrieren Sie in der oberen rechten Ecke eine neue Amazon SWF-Domäne. 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 Domänenamen verwenden. In den Anleitungen wird „helloWorldWalkthrough“ verwendet.

Weitere Informationen zur Verwaltung von Amazon SWF SWF-Workflows finden Sie unterEinrichtenaus.

Um HelloWorldWorkflow zu implementieren, erstellen Sie eine Kopie des helloWorld.HelloWorld-Pakets in Ihrem Projektverzeichnis und nennen Sie sie helloWorld.HelloWorldWorkflow. In den folgenden Abschnitten wird beschrieben, wie Sie den ursprünglichen HelloWorld-Code für die Verwendung desAWS Flow Frameworkfür Java und als Amazon SWF SWF-Workflow-Anwendung ausführen.

HelloWorldWorkflow-Aktivitäts-Worker

HelloWorld implementierte seine Aktivitäts-Worker als einzelne Klasse. Importieren in &S3;AWS Flow Frameworkfür Java-Aktivitäts-Worker verfügt über drei Grundkomponenten:

DieAktivitäts-Methoden— die die eigentlichen Aufgaben ausführen — werden in einer Schnittstelle definiert und in einer zugehörigen Klasse implementiert.

Importieren in &S3;ActivityWorkerclass 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ätsschnittstelle wie folgt in GreeterActivities :

import import @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 HelloWorld nicht unbedingt notwendig. Sie ist jedoch für einAWS Flow Frameworkfür Java-Anwendung. Beachten Sie, dass sich die Schnittstellendefinition selbst nicht geändert hat. Sie müssen jedoch zwei anwendenAWS Flow Frameworkfür Java-Annotationen@ActivityRegistrationOptionsund@Aktivität, zur Schnittstellendefinition. Die Anmerkungen liefern Konfigurationsinformationen und leiten dieAWS Flow Frameworkfür Java-Annotations-Prozessor, um die Schnittstellendefinition zum Generieren einesAktivitäts KundeKlasse, die später besprochen wird.

@ActivityRegistrationOptions hat mehrere benannte Werte, die zur Konfiguration des Verhaltens der Aktivitäten verwendet werden. HelloWorldWorkflow definiert zwei Timeouts:

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 folgendermaßen in GreeterActivitiesImpl :

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) { } }

Beachten Sie, dass der Code mit der HelloWorld-Implementierung identisch ist. Im Kern ist eine AWS Flow Framework-Aktivität nur eine Methode, die etwas Code ausführt und vielleicht ein Ergebnis liefert. Der Unterschied zwischen einer Standardanwendung und einer Amazon SWF 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 SWF-Workflow-Worker verfügt über drei Grundkomponenten.

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.

EINWorkflowWorker-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 import import @Workflow @WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 3600) public interface GreeterWorkflow { @Execute(version = "1.0") public void greet(); }

Diese Schnittstelle ist für HelloWorld nicht unbedingt notwendig.AWS Flow Frameworkfür Java-Anwendung. Sie müssen zwei bewerbenAWS Flow Frameworkfür Java-Annotationen@Workflowund@WorkflowRegistrationOptionszur Definition der Workflow-Schnittstellendefinition. Die Anmerkungen liefern Konfigurationsinformationen und leiten auch dieAWS Flow Frameworkfür Java-Annotationsprozessor, um eine Workflow-Client-Klasse basierend auf der Schnittstelle zu erzeugen (wird später beschrieben).

@Workflow hat einen optionalen Parameter dataConverter. Dieser wird oft mit dem Standardwert NullDataConverter verwendet. Der Standardwert gibt an, dass JsonDataConverter verwendet werden soll.

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

Die Definition der GreeterWorkflow -Schnittstelle unterscheidet sich in einem wichtigen Punkt von HelloWorld: der @Execute-Annotation. 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 legt keinen Namen oder eine Parameterliste für Workflow-Schnittstellenmethoden fest. Sie verwenden den Namen und die Parameterliste, die für Ihren Workflow geeignet sind. Sie verwenden eineAWS Flow Frameworkfür 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 in GreeterWorkflowImpl wie folgt:

import public class GreeterWorkflowImpl implements GreeterWorkflow { private GreeterActivitiesClient operations = new GreeterActivitiesClientImpl(); public void greet() { Promise name = operations.getName(); Promise greeting = operations.getGreeting(name); operations.say(greeting); } }

Der Code ist ähnlich wie bei HelloWorld. Es gibt jedoch zwei wichtige Unterschiede.

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 -Objekte statt String -Objekte zurück.

HelloWorld ist eine normale Java-Anwendung, die lokal als einzelner Prozess ausgeführt wird. GreeterWorkflowImpl kann die Workflow-Topologie implementieren, indem es einfach eine Instanz von GreeterActivitiesImpl erzeugt, die Methoden in der passenden Reihenfolge aufruft und die Rückgabewerte von einer Aktivität zur nächsten übergibt. Bei einem Amazon SWF SWF-Workflow wird die Aufgabe einer Aktivität weiterhin durch eine Aktivitätsmethode aus ausgeführt GreeterActivitiesImpl aus. 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 ü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 -Objekt zurück, wobei T der Rückgabetyp der Aktivität ist. Das zurückgegebene Promise -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 -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 -Objekt den Rückgabewert zu und versetzt es in den Zustand Ready.

Promise Type

Der Hauptzweck von Promise -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 -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 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 -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. mitAWS Flow FrameworkFür Java müssen Sie keinen speziellen Modellierungscode verwenden, um komplexe Topologien zu definieren. Sie nutzen nur die normale Java-Flusssteuerung und Promise aus. 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 -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 -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 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 -Objekts vorsichtig sein. Im Gegensatz zum Java-Typ Future übernimmt das Framework und nicht die Anwendung die Synchronisation für Promise . Wenn Sie Promise.get aufrufen und das Objekt nicht bereit ist, löst get eine Ausnahme aus. Beachten Sie, dass HelloWorldWorkflow nie direkt auf ein Promise -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 -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 -Objekte nur an Methoden des Activities-Clients übergeben werden. Sie können in Ihrer Workflow-Implementierung auf den Wert eines Promise -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.

Implementierung von Workflow und Aktivitäten für HelloWorldWorkflow

Die Implementierungen des Workflows und der Aktivitäten arbeiten mit zugeordneten Worker-Klassen (ActivityWorker und WorkflowWorker). Sie übernehmen die Kommunikation zwischen Amazon SWF und den Aktivitäts- und Workflow-Implementierungen, indem sie die entsprechende Amazon SWF SWF-Aufgabenliste abrufen, die Methode für jede Aufgabe ausführen und den Datenfluss verwalten. Details hierzu finden Sie unter AWS Flow FrameworkGrundkonzepte: 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 der 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 Amazon SWF zu kommunizieren.

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 halber implementiert HelloWorldWorkflow einen einzigen Worker-Host, der Aktivitäten und Workflow-Worker im selben Prozess ausführt:

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 import public class GreeterWorker { public static void main(String[] args) throws Exception { ClientConfiguration config = new 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); 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.start(); } }

GreeterWorker hat kein HelloWorld-Gegenstück. Daher müssen Sie dem Projekt eine Java-Klasse namens GreeterWorker hinzufügen und den Beispielcode in diese Datei kopieren.

Zunächst erstellen und konfigurieren Sie eineAmazonSimpleWorkflowClient-Objekt, das die zugrunde liegenden Amazon SWF-Servicemethoden aufruft. Hierzu geht GreeterWorker folgendermaßen vor:

Sie erstellt ein ClientConfiguration-Objekt und legt einen Socket-Timeout von 70 Sekunden fest. Dieser Wert gibt an, wie lange auf die Übertragung der Daten über eine bestehende offene Verbindung gewartet wird, bevor der Socket geschlossen wird. Erzeugt einBasicAWSCredentialsObjekt zur Identifizierung desAWSKonto 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. Sie erstellt ein AmazonSimpleWorkflowClient-Objekt zur Darstellung des Workflows und übergibt die BasicAWSCredentials - und ClientConfiguration -Objekte an den Konstruktor. Legt die Service-Endpunkt-URL des Client-Objekts fest. Amazon SWF ist derzeit in allen verfügbarAWSRegionen.

Der Einfachheit halber definiert GreeterWorker zwei String-Konstanten.

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

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

GreeterWorker verwendet die String-Konstanten und dieAmazonSimpleWorkflowClient-Objekt zur Erstellung von Worker-Objekten, 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 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 GreeterWorker und gehen Sie zur Amazon SWF SWF-Konsole und wählen Sie helloWorldWalkthrough aus der Liste der Domänen. Wenn Sie Workflow Types (Workflow-Typen) im Bereich Navigation auswählen, sollten Sie GreeterWorkflow.greet sehen:

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

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 den Verlauf und den Ausführungsstatus anzeigen können. HelloWorldWorkflow implementiert einen Workflow-Starter, indem die GreeterMain -Klasse wie folgt modifiziert 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 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); 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:

Erstellen Sie ein externes Client-Factory-Objekt und übergeben Sie AmazonSimpleWorkflowClient -Objekt und Amazon SWF-Domänenname an den Konstruktor. Das Client-Factory-Objekt wird vom Annotationsprozessor des Frameworks erstellt, der den Objektnamen durch einfaches Anhängen von „ClientExternalFactoryImpl“ an den Namen der Workflow-Schnittstelle erzeugt. Erstellen Sie ein externes Client-Objekt, indem Sie die getClient -Methode des Factory-Objekts aufrufen, die den Objektnamen durch Anhängen von „ClientExternal“ an den Namen der Workflow-Schnittstelle erzeugt. Sie können optional bestehen getClient eine Zeichenfolge, über die Amazon SWF verwendet, um diese Instance des Workflows zu identifizieren. Andernfalls repräsentiert Amazon SWF eine Workflow-Instance über eine generierte GUID.

Der von der Factory zurückgegebene Client erstellt nur Workflows, die mit dem an dengetClientMethode (Der von der Fabrik zurückgegebene Client hat in Amazon SWF bereits den Status). 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 nun in der Liste der aktiven Workflow-Ausführungen „someID“ in der Amazon SWF SWF-Konsole sehen:

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

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 zeigt an, dass Amazon SWF die erste Entscheidungsaufgabe in die Schlange 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.

Sie können einzelne Ereignisse auswählen, um weitere Informationen zu erhalten. Bis zum Ende der Suche sollte der Workflow „Hello World!“ ausgegeben haben 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).

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.

Andreas Müller

LEAVE A REVIEW