Contratti di flusso di lavoro e attività - 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à.

Contratti di flusso di lavoro e attività

Le interfacce Java sono utilizzate per dichiarare le firme dei flussi di lavoro e delle attività. L'interfaccia forma il contratto tra l'implementazione di flusso di lavoro (o attività) e il client del flusso di lavoro (o attività). Ad esempio, un tipo di flusso di lavoro MyWorkflow è definito usando un'interfaccia che è annotata con l'annotazione @Workflow:

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

Il contratto non dispone di impostazioni specifiche per l'implementazione. Questo utilizzo dei contratti neutrali rispetto alle implementazioni permette ai client di essere dissociati dall'implementazione e quindi offre la flessibilità per modificare i dettagli dell'implementazione senza spezzare il client. Viceversa, potresti cambiare il client senza dover modificare il flusso di lavoro o l'attività. Ad esempio, il client può essere modificato per chiamare un'attività in modo asincrono utilizzando le promesse (Promise<T>) senza richiedere una modifica all'implementazione di attività. Analogamente, l'implementazione dell'attività può essere modificata in modo che venga completata in modo asincrono, ad esempio da una persona che invia un'e-mail, senza richiedere la modifica dei client dell'attività.

Nell'esempio riportato sopra, l'interfaccia di flusso di lavoro MyWorkflow contiene un metodo, startMyWF, per avviare una nuova esecuzione. Questo metodo è annotato con l'annotazione @Execute e deve avere un tipo restituito void o Promise<>. In un'interfaccia di flusso di lavoro data, può al massimo essere annotato un metodo con questa annotazione. Questo metodo è il punto di ingresso della logica di flusso di lavoro e il framework chiama questo metodo per eseguire la logica di flusso di lavoro quando viene ricevuto un task di decisione.

L'interfaccia di flusso di lavoro definisce inoltre i segnali che possono essere inviati al flusso di lavoro. Il metodo di segnale viene invocato quando un segnale con un nome corrispondente viene ricevuto dall'esecuzione del flusso di lavoro. Ad esempio, l'interfaccia MyWorkflow dichiara un metodo di segnale signal1, annotato con l'annotazione @Signal.

L'annotazione @Signal è richiesta sui metodi di segnale. Il tipo restituito del metodo di segnale deve essere void. Un'interfaccia di flusso di lavoro potrebbe avere zero o più metodi di segnali definiti al proprio interno. Potresti dichiarare un'interfaccia di flusso di lavoro senza un metodo @Execute e alcuni metodi @Signal per generare client che non possono avviare la propria esecuzione ma inviare segnali per effettuare le esecuzioni.

Metodi annotati con le annotazioni @Execute e @Signal possono avere numeri di parametri di ogni tipo eccetto Promise<T> o le sue derivate. Questa funzionalità ti permette di passare input fortemente tipizzati a un'esecuzione di flusso di lavoro dall'avvio e durante la sua esecuzione. Il tipo restituito del metodo @Execute deve essere void o Promise<>.

Inoltre, puoi anche dichiarare un metodo nell'interfaccia di flusso di lavoro per segnalare l'ultimo stato dell'esecuzione del flusso di lavoro, ad esempio il metodo getState nel precedente esempio. Questo stato non è l'intero stato di applicazione del flusso di lavoro. Lo scopo di questa funzionalità è permetterti di archiviare fino a 32 KB di data per indicare l'ultimo stato dell'esecuzione. Ad esempio, in un flusso di lavoro di elaborazione dell'ordine, potresti archiviare una stringa che indica che l'ordine è stato ricevuto, elaborato o annullato. Questo metodo viene chiamato dal framework ogni volta che un task di decisione viene completato per ottenere l'ultimo stato. Lo stato viene archiviato in Amazon Simple Workflow Service (Amazon SWF) e può essere recuperato utilizzando il client esterno generato. Questo ti permette di verificare l'ultimo stato di esecuzione del flusso di lavoro. I metodi annotati con @GetState non devono acquisire argomenti e non devono avere un tipo restituito void. Da questo metodo puoi restituire qualunque tipo che si adatti alle tue esigenze. Nell'esempio citato prima, un oggetto di MyWorkflowState (vedi definizione riportata sotto) viene restituito dal metodo utilizzato per archiviare uno stato della stringa e una percentuale numerica completati. Il metodo dovrebbe eseguire l'accesso di sola lettura dell'oggetto dell'implementazione del flusso di lavoro e viene richiamato in modo sincronico, il che non permette l'utilizzo di operazioni asincrone come i metodi di chiamata con @Asynchronous. Può essere annotato al massimo un metodo in un'interfaccia di flusso di lavoro con l'annotazione @GetState.

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

Analogamente, un set di iniziative viene definito usando un'interfaccia che è annotata con l'annotazione @Activities. Ciascun metodo nell'interfaccia corrisponde a un'attività, ad esempio:

@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); }

L'interfaccia ti permette di raggruppare un set di iniziative relazionate. Puoi definire qualunque numero di attività all'interno dell'interfaccia delle attività e puoi definire il numero di interfacce delle attività che desideri. Analogamente ai metodi @Execute e @Signal, i metodi di attività possono acquisire qualunque numero di argomenti di qualunque tipo tranne Promise<T> o le sue derivate. Il tipo restituito di un'attività non deve essere Promise<T> o le sue derivate.