

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.

# Ausführungskontext
<a name="executioncontext"></a>

**Topics**
+ [Entscheidungskontext](#executioncontext.decision)
+ [Aktivitätsausführungskontext](#activitycontext)

Das Framework gibt dem Workflow und den Aktivitätsimplementierungen einen Umgebungskontext. Dieser Kontext bezieht sich jeweils auf die ausgeführte Aufgabe und stellt einige Dienstprogramme bereit, die Sie in der Implementierung verwenden können. Ein Kontextobjekt wird jedes Mal erstellt, wenn eine neue Aufgabe vom Auftragnehmer verarbeitet wird.

## Entscheidungskontext
<a name="executioncontext.decision"></a>

Wenn eine Entscheidungsaufgabe ausgeführt wird, stellt das Framework den Kontext für die Workflow-Implementierung über die `DecisionContext`-Klasse zur Verfügung. `DecisionContext` liefert kontextsensitive Informationen wie die ID des Workflow-Ausführungslaufs und die Takt- und Timerfunktionalität.

### Zugriff DecisionContext bei der Workflow-Implementierung
<a name="executioncontext.decision.access"></a>

Sie können auf den `DecisionContext` in Ihrer Workflow-Implementierung unter Verwendung der `DecisionContextProviderImpl`-Klasse zugreifen. Alternativ können Sie den Kontext in einem Feld oder einer Eigenschaft Ihrer Workflow-Implementierung angeben. Verwenden Sie dazu Spring, wie im Abschnitt "Prüfbarkeit und Dependency Injection" beschrieben.

```
DecisionContextProvider contextProvider
    = new DecisionContextProviderImpl();
DecisionContext context = contextProvider.getDecisionContext();
```

### Erstellen einer Uhr und eines Timers
<a name="executioncontext.decision.timer"></a>

Der `DecisionContext` enthält eine Eigenschaft vom Typ `WorkflowClock`, die eine Timer- und Uhrfunktion bereitstellt. Da die Workflow-Logik deterministisch sein muss, sollten Sie die Systemuhr in Ihrer Workflow-Implementierung nicht direkt verwenden. Die `currentTimeMills`-Methode in der `WorkflowClock` gibt den Zeitpunkt des Startereignisses der zu verarbeitenden Entscheidung zurück. So wird sichergestellt, dass Sie denselben Zeitwert bei einer Wiedergabe erhalten und eine deterministische Workflow-Logik erhalten.

`WorkflowClock` umfasst auch eine `createTimer`-Methode, die ein `Promise`-Objekt zurückgibt, das nach einem festgelegten Intervall verfügbar wird. Verwenden Sie diesen Wert als Parameter für andere asynchrone Methoden, um deren Ausführung um einen festgelegten Zeitraum zu verschieben. So können Sie eine asynchrone Methode oder Aktivität effektiv für eine spätere Ausführung planen.

Im folgenden Beispiel wird gezeigt, wie Sie eine Aktivität periodisch aufrufen können.

```
@Workflow
@WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 60,
               defaultTaskStartToCloseTimeoutSeconds = 10)
public interface PeriodicWorkflow {

    @Execute(version = "1.0")
    void periodicWorkflow();
}

@Activities(version = "1.0")
@ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300,
                             defaultTaskStartToCloseTimeoutSeconds = 3600)
public interface PeriodicActivity {
    void activity1();
}

public class PeriodicWorkflowImpl implements PeriodicWorkflow {

    private DecisionContextProvider contextProvider
         = new DecisionContextProviderImpl();

    private WorkflowClock clock
         = contextProvider.getDecisionContext().getWorkflowClock();

    @Override
    public void periodicWorkflow() {
        callPeriodicActivity(0);
    }

    @Asynchronous
    private void callPeriodicActivity(int count,
                                      Promise<?>... waitFor) {
        if (count == 100) {
            return;
        }
        PeriodicActivityClient client = new PeriodicActivityClientImpl();
        // call activity
        Promise<Void> activityCompletion = client.activity1();

        Promise<Void> timer = clock.createTimer(3600);

        // Repeat the activity either after 1 hour or after previous activity run
        // if it takes longer than 1 hour
        callPeriodicActivity(count + 1, timer, activityCompletion);
    }
}


public class PeriodicActivityImpl implements PeriodicActivity
{
@Override
   public void activity1() {
      ...
      }
}
```

In der Liste oben ruft die asynchrone Methode `callPeriodicActivity` `activity1` auf und erstellt einen Timer mit dem aktuellen `AsyncDecisionContext`. Sie übergibt das zurückgegebene `Promise` als Argument an einen rekursiven Aufruf von sich selbst. Dieser rekursive Aufruf wartet, bis der Timer ausgelöst wird (in diesem Beispiel eine Stunde), bevor er ausgeführt wird.

## Aktivitätsausführungskontext
<a name="activitycontext"></a>

Genau wie der `DecisionContext` enthält der Aktivitätsausführungskontext Kontextinformationen zur Verarbeitung einer Entscheidungsaufgabe. `ActivityExecutionContext` stellt ähnliche Kontextinformationen bereit, wenn eine Aktivitätsausgabe verarbeitet wird. Dieser Kontext ist für Ihren Aktivitätscode über die Klasse `ActivityExecutionContextProviderImpl` verfügbar.

```
ActivityExecutionContextProvider provider
    = new ActivityExecutionContextProviderImpl();
ActivityExecutionContext aec = provider.getActivityExecutionContext();
```

Mit `ActivityExecutionContext` können Sie folgende Aufgaben ausführen:

### Heartbeat für eine langfristige Aktivität
<a name="activitycontext.heartbeat"></a>

Wenn die Aktivität lange andauert, muss sie ihren Fortschritt regelmäßig an Amazon SWF melden, um sie darüber zu informieren, dass die Aufgabe weiterhin voranschreitet. Wenn kein Heartbeat gesendet wird, kann eine Zeitüberschreitung auftreten, wenn diese bei der Registrierung des Aktivitätstyps oder beim Planen der Aktivität definiert wurde. Um einen Heartbeat zu senden, können Sie die `recordActivityHeartbeat`-Methode im `ActivityExecutionContext` verwenden. Ein Heartbeat kann auch dazu dienen, laufende Aktivitäten abzubrechen. Weitere Informationen sowie ein Beispiel finden Sie im Abschnitt [Fehlerbehandlung](errorhandling.md).

### Abrufen von Details zur Aktivitätsaufgabe
<a name="activitycontext.details"></a>

Wenn Sie möchten, können Sie alle Details der Aktivitätsaufgabe abrufen, die von Amazon SWF übergeben wurden, als der Executor die Aufgabe erhielt. Dies umfasst Informationen zu den Eingaben der Aufgabe, Aufgabentyp, Aufgabentoken usw. Wenn Sie eine Aktivität implementieren möchten, die manuell abgeschlossen wird, z. B. durch eine menschliche Aktion, müssen Sie das verwenden, um das Aufgaben-Token abzurufen und es `ActivityExecutionContext` an den Prozess weiterzuleiten, der die Aktivitätsaufgabe letztendlich abschließt. Weitere Informationen finden Sie im Abschnitt zu [Aktivitäten manuell abschließen](activityimpl.md#activityimpl.complete).

### Ruft das Amazon SWF-Client-Objekt ab, das vom Executor verwendet wird
<a name="activitycontext.client"></a>

Das vom Executor verwendete Amazon SWF-Client-Objekt kann durch Aufrufen der `getService` Methode on abgerufen werden. `ActivityExecutionContext` Dies ist nützlich, wenn Sie den Amazon SWF-Service direkt anrufen möchten.