

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# HelloWorldWorkflowAsync Bewerbung
<a name="getting-started-example-helloworldworkflowasync"></a>

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

Eine asynchrone Methode wird ähnlich wie eine Standardmethode implementiert — oft als Mitglied der Workflow-Implementierungsklasse — und wird im Kontext der Workflow-Implementierung ausgeführt. Sie legen sie als asynchrone Methode fest, indem Sie eine `@Asynchronous`-Anmerkung anwenden, wodurch das Framework angewiesen wird, sie ähnlich wie eine Aktivität zu behandeln.
+ Wenn eine Workflow-Implementierung eine asynchrone Methode aufruft, wird sie sofort zurückgegeben. Asynchrone Methoden geben in der Regel ein `Promise<T>`-Objekt zurück, das verfügbar wird, wenn die Methode abgeschlossen ist.
+ Wenn Sie einer asynchronen Methode eine oder mehrere `Promise<T>`-Objekte übergeben, verschiebt sie die Ausführung, bis alle Eingabeobjekte bereit sind. Eine asynchrone Methode kann daher auf ihre `Promise<T>`-Werte der Eingabe zugreifen, ohne eine Ausnahme zu riskieren.

**Anmerkung**  
Aufgrund der Art und Weise, wie die AWS Flow Framework für Java den Workflow ausführt, werden asynchrone Methoden in der Regel mehrfach ausgeführt. Sie sollten sie daher nur für schnelle Aufgaben mit geringem Overhead verwenden. Aktivitäten sollten Sie zur Durchführung zeitintensiver Aufgaben wie großen Berechnungen verwenden. Details hierzu finden Sie unter [AWS Flow Framework Grundbegriffe: Verteilte Ausführung](awsflow-basics-distributed-execution.md).

Dieses Thema ist eine exemplarische Vorgehensweise für eine modifizierte Version HelloWorldWorkflowAsync, HelloWorldWorkflow die eine der Aktivitäten durch eine asynchrone Methode ersetzt. Um die Anwendung zu implementieren, erstellen Sie eine Kopie von HelloWorld. HelloWorldWorkflow packe es in dein Projektverzeichnis und nenne es HelloWorld. HelloWorldWorkflowAsync. 

**Anmerkung**  
Dieses Thema baut auf den Konzepten und Dateien auf, die in den Themen [HelloWorld Bewerbung](getting-started-example-helloworld.md) und [HelloWorldWorkflow Bewerbung](getting-started-example-helloworldworkflow.md) vorgestellt werden. Machen Sie sich mit den Dateien und vorgestellten Konzepten finden Sie in diesen Themen, bevor Sie fortfahren.

In den folgenden Abschnitten wird beschrieben, wie der ursprüngliche HelloWorldWorkflow Code geändert wird, um eine asynchrone Methode zu verwenden.

## HelloWorldWorkflowAsync Implementierung der Aktivitäten
<a name="getting-started-example-helloworldworkflowasync.activities"></a>

HelloWorldWorkflowAsync implementiert seine Worker-Schnittstelle für Aktivitäten wie folgt: `GreeterActivities`

```
import com.amazonaws.services.simpleworkflow.flow.annotations.Activities;
import com.amazonaws.services.simpleworkflow.flow.annotations.ActivityRegistrationOptions;

@Activities(version="2.0")
@ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300,
                             defaultTaskStartToCloseTimeoutSeconds = 10)
public interface GreeterActivities {
   public String getName();
   public void say(String what);
}
```

Diese Schnittstelle ähnelt der von verwendeten HelloWorldWorkflow, mit den folgenden Ausnahmen:
+ Sie lässt die `getGreeting`-Aktivität weg. Diese Aufgabe wird jetzt von einer asynchronen Methode verarbeitet.
+ Die Versionsnummer wird auf 2.0. Nachdem Sie eine Aktivitätsschnittstelle bei Amazon SWF registriert haben, können Sie sie nur ändern, wenn Sie die Versionsnummer ändern.

Die übrigen Implementierungen der Aktivitätsmethoden sind identisch mit. HelloWorldWorkflow Löschen Sie einfach `getGreeting` aus `GreeterActivitiesImpl`.

## HelloWorldWorkflowAsync Workflow-Implementierung
<a name="getting-started-example-helloworldworkflowasync.workflow"></a>

HelloWorldWorkflowAsync definiert die Workflow-Schnittstelle wie folgt:

```
import com.amazonaws.services.simpleworkflow.flow.annotations.Execute;
import com.amazonaws.services.simpleworkflow.flow.annotations.Workflow;
import com.amazonaws.services.simpleworkflow.flow.annotations.WorkflowRegistrationOptions;

@Workflow
@WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 3600)
public interface GreeterWorkflow {

   @Execute(version = "2.0")
   public void greet();
}
```

Die Schnittstelle ist bis auf HelloWorldWorkflow eine neue Versionsnummer identisch mit. Wenn Sie einen registrierten Workflow ändern möchten, müssen Sie wie bei Aktivitäten seine Version ändern.

HelloWorldWorkflowAsync implementiert den Workflow wie folgt:

```
import com.amazonaws.services.simpleworkflow.flow.annotations.Asynchronous;
import com.amazonaws.services.simpleworkflow.flow.core.Promise;

public class GreeterWorkflowImpl implements GreeterWorkflow {
   private GreeterActivitiesClient operations = new GreeterActivitiesClientImpl();

   @Override
   public void greet() {
      Promise<String> name = operations.getName();
      Promise<String> greeting = getGreeting(name);
      operations.say(greeting);
   }

   @Asynchronous
   private Promise<String> getGreeting(Promise<String> name) {
      String returnString = "Hello " + name.get() + "!";
      return Promise.asPromise(returnString);
   }
}
```

HelloWorldWorkflowAsync ersetzt die `getGreeting` Aktivität durch eine `getGreeting` asynchrone Methode, aber die `greet` Methode funktioniert fast genauso:

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

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

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

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

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

Der Unterschied liegt darin, dass Greet (Gruß) nicht den Aktivitäten-Client aufruft, um eine `getGreeting`-Aktivität auszuführen, sondern die asynchrone `getGreeting`-Methode. Das Endergebnis ist dasselbe, aber die `getGreeting`-Methode funktioniert etwas anders als die `getGreeting`-Aktivität.
+ Der Workflow-Worker verwendet Aufrufsemantiken der Standardfunktion für die Ausführung von `getGreeting`. Die asynchrone Ausführung der Aktivität wird jedoch von Amazon SWF vermittelt.
+ `getGreeting` wird im Prozess der Workflow-Implementierung ausgeführt.
+ `getGreeting` gibt ein `Promise<String>`-Objekt anstelle eines `String`-Objekts zurück. Um den Zeichenfolgewert abzurufen, der sich im Besitz von `Promise` befindet, rufen Sie seine `get()`-Methode auf. Da die Aktivität jedoch asynchron ausgeführt wird, ist ihr Rückgabewert möglicherweise nicht sofort bereit. Es `get()` wird eine Ausnahme ausgelöst, bis der Rückgabewert der asynchronen Methode verfügbar ist.

  Weitere Informationen zur Funktionsweise von `Promise` finden Sie unter [AWS Flow Framework Grundbegriffe: Data Exchange zwischen Aktivitäten und Workflows](awsflow-basics-data-exchange-activities-workflows.md).

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

## HelloWorldWorkflowAsync Arbeitsablauf und Aktivitäten: Host und Starter
<a name="getting-started-example-helloworldworkflowasync.host"></a>

HelloWorldWorkflowAsync implementiert `GreeterWorker` als Hostklasse für die Workflow- und Aktivitätsimplementierungen. Sie ist mit der HelloWorldWorkflow Implementierung identisch, mit Ausnahme des `taskListToPoll` Namens, der auf "`HelloWorldAsyncList`" gesetzt ist.

```
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow;
import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient;
import com.amazonaws.services.simpleworkflow.flow.ActivityWorker;
import com.amazonaws.services.simpleworkflow.flow.WorkflowWorker;

public class GreeterWorker {
    public static void main(String[] args) throws Exception {
        ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000);

        String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID");
        String swfSecretKey = System.getenv("AWS_SECRET_KEY");
        AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey);

        AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config);
        service.setEndpoint("https://swf.us-east-1.amazonaws.com");

        String domain = "helloWorldWalkthrough";
        String taskListToPoll = "HelloWorldAsyncList";

        ActivityWorker aw = new ActivityWorker(service, domain, taskListToPoll);
        aw.addActivitiesImplementation(new GreeterActivitiesImpl());
        aw.start();

        WorkflowWorker wfw = new WorkflowWorker(service, domain, taskListToPoll);
        wfw.addWorkflowImplementationType(GreeterWorkflowImpl.class);
        wfw.start();
    }
}
```

HelloWorldWorkflowAsync implementiert den Workflow-Starter in`GreeterMain`; er ist identisch mit der HelloWorldWorkflow Implementierung.

Um den Workflow auszuführen, führen Sie `GreeterWorker` und aus`GreeterMain`, genau wie bei HelloWorldWorkflow.