

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.

# Workflow- und Aktivitäts-Verträge
<a name="features.workflow"></a>

Java-Schnittstellen werden zum Deklarieren der Signaturen der Workflows und Aktivitäten verwendet. Die Schnittstelle bildet den Vertrag zwischen der Implementierung des Workflows (oder der Aktivität) und dem Client dieses Workflows (oder der Aktivität). Ein Workflow-Typ `MyWorkflow` wird beispielsweise mithilfe einer Schnittstelle definiert, die mit der `@Workflow`-Anmerkung versehen ist: 

```
@Workflow
@WorkflowRegistrationOptions(
   defaultExecutionStartToCloseTimeoutSeconds = 60,
   defaultTaskStartToCloseTimeoutSeconds = 10)
public interface MyWorkflow
{
    @Execute(version = "1.0")
    void startMyWF(int a, String b);

    @Signal
    void signal1(int a, int b, String c);

    @GetState
    MyWorkflowState getState();
}
```

Der Vertrag hat keine implementierungsspezifischen Einstellungen. Diese Nutzung der implementierungsneutralen Verträge ermöglicht es, dass Client von der Implementierung entkoppelt werden, und bietet dadurch die Flexibilität, die Implementierungsdetails zu ändern, ohne den Client zu brechen. Umgekehrt können Sie den Client auch ändern, ohne zu nötigen, dass Änderungen am Workflow oder der Aktivität verbraucht werden. Beispielsweise kann der Client so geändert werden, dass er eine Aktivität asynchron unter Verwendung von Promises (`Promise<T>`) aufruft, ohne eine Änderung an der Aktivitätsimplementierung zu erfordern. In ähnlicher Weise kann die Implementierung der Aktivität so geändert werden, dass sie asynchron abgeschlossen wird, z. B. durch eine Person, die eine E-Mail sendet, ohne dass die Clients der Aktivität geändert werden müssen. 

Im Beispiel oben enthält die Workflow-Instance `MyWorkflow` eine Methode, `startMyWF`, für das Starten einer neuen Ausführung. Diese Methode wird mit der `@Execute`-Anmerkung versehen und muss einen Rückgabetyp von `void` oder `Promise<>` haben. In einer gegebenen Workflow-Schnittstelle kann maximal eine Methode mit dieser Anmerkung versehen werden. Diese Methode ist der Eintrittspunkt der Workflow-Logik und das Framework ruft diese Methode auf, um die Workflow-Logik auszuführen, wenn eine Entscheidungsaufgabe empfangen wird. 

Die Workflow-Schnittstelle definiert auch die Signale, die an den Workflow gesendet werden können. Die Signalmethode wird aufgerufen, wenn ein Signal mit einem passenden Namen von der Workflow-Ausführung empfangen wird. Beispielsweise deklariert die `MyWorkflow`-Schnittstelle eine Signalmethode, `signal1`, mit der Anmerkung `@Signal` versehen. 

Die `@Signal`-Anmerkung ist auf Signalmethoden erforderlich. Der Rückgabetyp einer Signalmethode muss `void` sein. Eine Workflow-Schnittstelle kann null oder mehrere Signalmethoden in ihr definiert haben. Sie können eine Workflow-Schnittstelle ohne eine `@Execute`-Methode deklarieren und einige `@Signal`-Methoden zum Generieren von Clients deklarieren, die ihre Ausführung nicht starten, aber Signal an laufende Ausführungen senden können.

Methoden, die mit den Anmerkungen `@Execute` und `@Signal` versehen sind, können eine beliebige Anzahl an Parametern jeden Typ haben, abgesehen von `Promise<T>` oder seinen Derivaten. Dadurch können Sie stark typisierte Eingaben beim Start und während der Ausführung an eine Workflow-Ausführung übergeben. Der Rückgabetyp der `@Execute`-Methode muss `void` oder `Promise<>` sein. 

Zudem können Sie auch eine Methode in der Workflow-Schnittstelle deklarieren, um den aktuellen Zustand einer Workflow-Ausführung zu melden, zum Beispiel die `getState`-Methode im vorherigen Beispiel. Dieser Zustand ist nicht der gesamte Anwendungszustand des Workflows. Die vorgesehene Nutzung dieser Funktion ist, die Speicherung von bis zu 32 KB an Daten zuzulassen, um den aktuellen Status der Ausführung anzugeben. In einem Bestellvorgangs-Workflow können Sie auch eine Zeichenfolge speichern, die angibt, dass die Bestellung eingegangen, verarbeitet oder storniert wurde. Diese Methode wird jedes Mal, wenn eine Entscheidungsaufgabe abgeschlossen wurde, vom Framework aufgerufen, um den aktuellen Zustand zu erhalten. Der Status wird in Amazon Simple Workflow Service (Amazon SWF) gespeichert und kann mit dem generierten externen Client abgerufen werden. Auf diese Weise können Sie den aktuellen Zustand einer Workflow-Ausführung prüfen. Mit `@GetState` versehene Methoden dürfen keine Argumente akzeptieren und dürfen nicht den Rückgabetyp `void` haben. Sie können jeden Typ, der ihren Anforderungen entspricht, von dieser Methode zurückgeben. Im Beispiel oben wird ein Objekt `MyWorkflowState` (siehe Definition unten) von der Methode zurückgegeben, die verwendet wird, um einen Zeichenfolgenzustand und einen numerischen Prozentabschluss zu speichern. Diese Methode soll einen schreibgeschützten Zugriff auf das Workflow-Implementierungsobjekt durchführen und wird synchron aufgerufen, wodurch die Verwendung von asynchronen Operationen, wie das Aufrufen von Methoden mit der Anmerkung `@Asynchronous` nicht mehr zulässig ist. In einer Workflow-Schnittstelle kann maximal eine Methode mit dieser Anmerkung `@GetState` versehen werden. 

```
public class MyWorkflowState {
   public String status;
   public int percentComplete;
}
```

Gleichermaßen wird eine Reihe von Aktivitäten mit einer Schnittstelle mit der Anmerkung `@Activities` definiert. Jede Methode in der Schnittstelle entspricht einer Aktivität — zum Beispiel: 

```
@Activities(version = "1.0")
@ActivityRegistrationOptions(
     defaultTaskScheduleToStartTimeoutSeconds = 300,
     defaultTaskStartToCloseTimeoutSeconds = 3600)
public interface MyActivities {
    // Overrides values from annotation found on the interface
    @ActivityRegistrationOptions(description = "This is a sample activity",
         defaultTaskScheduleToStartTimeoutSeconds = 100,
         defaultTaskStartToCloseTimeoutSeconds = 60)
    int activity1();

    void activity2(int a);
}
```

Über die Schnittstelle können Sie eine Reihe von verwandten Aktivitäten gruppieren. Sie können eine beliebige Anzahl von Aktivitäten innerhalb einer Aktivitäten-Schnittstelle definieren und Sie können so viele Aktivitäten-Schnittstellen definieren wie Sie möchten. Ähnlich wie die Methoden `@Execute` und `@Signal` können Aktivitätsmethoden eine beliebige Anzahl an Argumenten jeden Typs akzeptieren, abgesehen von `Promise<T>` oder seinen Derivaten. Der Rückgabetyp einer Aktivität darf nicht `Promise<T>` oder seine Derivate sein. 