Contesto di esecuzione - AWS Flow Framework per Java

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Contesto di esecuzione

Il framework fornisce un contesto di ambiente alle implementazioni di flusso di lavoro e attività. Questo contesto è specifico del task in corso di elaborazione e fornisce alcune utilità che puoi utilizzare nella tua implementazione. Un oggetto di contesto è creato ogni volta che il lavoratore elabora un nuovo task.

Contesto di decisione

Quando un'attività viene eseguita, la decisione quadro fornisce il contesto per l'implementazione di flussi di lavoro attraverso la DecisionContext classe DecisionContext fornisce informazioni sensibili al contesto quali l'esecuzione del flusso di lavoro eseguire Id e orologio timer e funzionalità.

Accesso a DecisionContext nell'implementazione di flusso di lavoro

Puoi accedere a DecisionContext nell'implementazione di flusso di lavoro utilizzando la classe DecisionContextProviderImpl. In alternativa, puoi inserire il contesto in un campo o in una proprietà di tale implementazione utilizzando Spring come mostrato nella sezione relativa alla testabilità e all'inserimento delle dipendenze.

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

Creazione di un orologio e di un timer

La classe DecisionContext contiene una proprietà di tipo WorkflowClock che fornisce la funzionalità di orologio e timer. Poiché la logica di flusso di lavoro deve essere deterministica, non devi utilizzare direttamente l'orologio di sistema nell'implementazione di flusso di lavoro. Il metodo currentTimeMills su WorkflowClock restituisce l'ora dell'evento di avvio della decisione in corso di elaborazione. In questo modo, ottieni lo stesso valore di ora durante la riproduzione, rendendo di conseguenza deterministica la logica di flusso di lavoro.

WorkflowClock include inoltre un metodo createTimer che restituisce un oggetto Promise che diventa pronto dopo l'intervallo specificato. Puoi utilizzare questo valore come parametro per altri metodi asincroni allo scopo di ritardarne l'esecuzione in base al periodo di tempo specificato. In questo modo, puoi pianificare efficacemente un'attività o un metodo asincrono per un'esecuzione successiva.

L'esempio nel listato seguente mostra come chiamare periodicamente un'attività.

@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() { ... } }

Nel listato precedente, il metodo asincrono callPeriodicActivity chiama activity1 e quindi crea un timer utilizzando la classe AsyncDecisionContext corrente. Passa l'oggetto Promise restituito come argomento a una chiamata ricorsiva a se stesso. Questa chiamata attende fino all'attivazione del timer (1 ora i questo esempio) prima dell'esecuzione.

Contesto di esecuzione di attività

Esattamente come DecisionContext fornisce informazioni di contesto quando un task di decisione è in corso di elaborazione, ActivityExecutionContext fornisce informazioni di contesto simili durante l'elaborazione di un task di attività. Questo contesto è disponibile per il tuo codice delle attività mediante la classe ActivityExecutionContextProviderImpl.

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

Utilizzando ActivityExecutionContext, puoi eseguire le seguenti operazioni:

Heartbeat di un'attività a esecuzione prolungata

Se l'attività è a esecuzione prolungata, deve segnalare periodicamente il proprio avanzamento a Amazon SWF per notificare che l'elaborazione del task è ancora in corso. In assenza di tale heartbeat, è possibile che si verifichi il timeout del task se un timeout di heartbeat è stato impostato alla registrazione del tipo di attività o durante la pianificazione dell'attività. Per inviare un heartbeat, puoi utilizzare il metodo recordActivityHeartbeat su ActivityExecutionContext. L'heartbeat fornisce inoltre un meccanismo per annullare le attività in corso. Per informazioni dettagliate e un esempio, consulta la sezione Gestione errori.

Ottenimento dei dettagli del task di attività

Se lo desideri, puoi ottenere tutti i dettagli del task di attività passati da Amazon SWF quando l'esecutore ha ricevuto il task. Sono incluse le informazioni relative agli input al task, il tipo di task, il token del task, ecc. Se si desidera implementare un'attività completata manualmente, ad esempio da un'azione umana, è necessario utilizzare laActivityExecutionContextper recuperare il token di attività e passarlo al processo che alla fine completerà l'attività di attività. Per ulteriori informazioni, consulta la sezione su Completamento manuale della attività.

Ottenimento dell'oggetto client di Amazon SWF di utilizzato dall'esecutore

L'oggetto client di Amazon SWF di utilizzato dall'esecutore può essere recuperato chiamandogetServicesuActivityExecutionContext. Ciò è utile se desideri effettuare una chiamata diretta al servizio Amazon SWF.