La AWS SDK for Java versione 1.x è entrata in modalità manutenzione il 31 luglio 2024 e sarà disponibile il 31 end-of-support
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à.
Creazione di un'Amazon SWFapplicazione semplice
Questo argomento ti introdurrà alla programmazione di Amazon SWF
Informazioni sull'esempio
Il progetto di esempio creerà un flusso di lavoro con una singola attività che accetta i dati del flusso di lavoro passati attraverso il AWS cloud (nella tradizione diHelloWorld, sarà il nome di qualcuno da salutare) e quindi stampa un saluto in risposta.
Sebbene questo sembri molto semplice in apparenza, Amazon SWF le applicazioni sono costituite da una serie di parti che lavorano insieme:
-
Un dominio, utilizzato come contenitore logico per i dati di esecuzione del flusso di lavoro.
-
Uno o più flussi di lavoro che rappresentano componenti del codice che definiscono l'ordine logico di esecuzione delle attività del flusso di lavoro e dei flussi di lavoro secondari.
-
Un operatore del flusso di lavoro, noto anche come decisore, che effettua sondaggi per le attività decisionali e pianifica le attività o i flussi di lavoro dei figli in risposta.
-
Una o più attività, ognuna delle quali rappresenta un'unità di lavoro nel flusso di lavoro.
-
Un operatore delle attività che effettua sondaggi per le attività e esegue i metodi di attività in risposta.
-
Uno o più elenchi di attività, ovvero code gestite e Amazon SWF utilizzate per inviare richieste ai lavoratori del flusso di lavoro e delle attività. Le attività in un elenco di attività destinate ai lavoratori del flusso di lavoro sono chiamate attività decisionali. Quelli destinati agli addetti alle attività sono chiamati compiti di attività.
-
Uno strumento per avviare il flusso di lavoro che avvia l'esecuzione del flusso di lavoro.
Dietro le quinte, Amazon SWF orchestra il funzionamento di questi componenti, ne coordina il flusso dal AWS cloud, passa i dati tra di loro, gestisce i timeout e le notifiche del battito cardiaco e registra la cronologia di esecuzione del flusso di lavoro.
Prerequisiti
Ambiente di sviluppo
L'ambiente di sviluppo utilizzato in questo tutorial è composto da:
-
Tipo AWS SDK for Java
. -
JDK 1.7 o versioni successive. Questo tutorial è stato sviluppato e testato utilizzando JDK 1.8.0.
-
Un buon editor di testo Java (a tua scelta).
Nota
Se utilizzi un sistema di compilazione diverso da Maven, puoi comunque creare un progetto utilizzando i passaggi appropriati per il tuo ambiente e utilizzare i concetti forniti qui per proseguire. Ulteriori informazioni sulla configurazione e l'utilizzo di AWS SDK for Java con vari sistemi di build sono disponibili in Guida introduttiva.
Allo stesso modo, ma con maggiore impegno, i passaggi mostrati qui possono essere implementati utilizzando uno qualsiasi degli AWS SDK con supporto perAmazon SWF.
Tutte le dipendenze esterne necessarie sono incluse inAWS SDK for Java, quindi non c'è nulla di aggiuntivo da scaricare.
AWSAccesso
Per eseguire correttamente questo tutorial, è necessario accedere al portale di AWS accesso come descritto nella sezione relativa alla configurazione di base di questa guida.
Le istruzioni descrivono come accedere alle credenziali temporanee da copiare e incollare nel credentials
file condiviso locale. Le credenziali temporanee che incolli devono essere associate a un ruolo IAM con le autorizzazioni per accedere ad Amazon SWF. AWS IAM Identity Center Dopo aver incollato le credenziali temporanee, il credentials
file risulterà simile al seguente:
[default] aws_access_key_id=AKIAIOSFODNN7EXAMPLE aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY aws_session_token=IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZVERYLONGSTRINGEXAMPLE
Queste credenziali temporanee sono associate al default
profilo.
Creazione di un progetto SWF
-
Iniziare un nuovo progetto con Maven.
mvn archetype:generate -DartifactId=helloswf \ -DgroupId=aws.example.helloswf -DinteractiveMode=false
Questo creerà un nuovo progetto con una struttura di progetto Maven standard:
helloswf ├── pom.xml └── src ├── main │ └── java │ └── aws │ └── example │ └── helloswf │ └── App.java └── test └── ...
Puoi ignorare o eliminare la
test
cartella e tutto ciò che contiene, non la useremo per questo tutorial. Puoi anche eliminareApp.java
, poiché lo sostituiremo con nuove classi. -
Modifica il
pom.xml
file del progetto e aggiungi il aws-java-sdk-simpleworkflowmodulo aggiungendo una dipendenza all'interno del<dependencies>
blocco.<dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-simpleworkflow</artifactId> <version>1.11.1000</version> </dependency> </dependencies>
-
Assicurati che Maven crei il tuo progetto con il supporto per JDK 1.7+. Aggiungi quanto segue al tuo progetto (prima o dopo il
<dependencies>
blocco) inpom.xml
:<build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
Codifica il progetto
Il progetto di esempio sarà composto da quattro applicazioni separate, che visiteremo una per una:
-
HelloTypes.java --contiene i dati del dominio, dell'attività e del tipo di flusso di lavoro del progetto, condivisi con gli altri componenti. Gestisce anche la registrazione di questi tipi con SWF.
-
ActivityWorker.java --contiene l'activity worker, che effettua sondaggi per le attività ed esegue le attività in risposta.
-
WorkflowWorker.java --contiene il workflow worker (decider), che effettua sondaggi per le attività decisionali e pianifica nuove attività.
-
WorkflowStarter.java --contiene lo starter del flusso di lavoro, che avvia una nuova esecuzione del flusso di lavoro, che farà sì che SWF inizi a generare attività decisionali e di flusso di lavoro che i dipendenti possono utilizzare.
Passaggi comuni per tutti i file sorgente
Tutti i file che crei per ospitare le tue classi Java avranno alcune cose in comune. Per risparmiare tempo, ogni volta che aggiungerete un nuovo file al progetto, saranno necessari questi passaggi:
-
Crea il file nella
src/main/java/aws/example/helloswf/
directory del progetto. -
Aggiungi una
package
dichiarazione all'inizio di ogni file per dichiararne lo spazio dei nomi. Il progetto di esempio utilizza:package aws.example.helloswf;
-
Aggiungi
import
dichiarazioni per la AmazonSimpleWorkflowClientclasse e per più classi nelcom.amazonaws.services.simpleworkflow.model
namespace. Per semplificare le cose, useremo:import com.amazonaws.regions.Regions; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder; import com.amazonaws.services.simpleworkflow.model.*;
Registrazione di un dominio, un flusso di lavoro e un tipo di attività
Inizieremo creando una nuova classe eseguibile,HelloTypes.java
. Questo file conterrà dati condivisi che le diverse parti del flusso di lavoro devono conoscere, come il nome e la versione dell'attività e dei tipi di flusso di lavoro, il nome di dominio e il nome dell'elenco delle attività.
-
Apri il tuo editor di testo e crea il file
HelloTypes.java
, aggiungi una dichiarazione di pacchetto e importa secondo i passaggi più comuni. -
Dichiara la
HelloTypes
classe e forniscile i valori da utilizzare per le attività registrate e i tipi di flusso di lavoro:public static final String DOMAIN = "HelloDomain"; public static final String TASKLIST = "HelloTasklist"; public static final String WORKFLOW = "HelloWorkflow"; public static final String WORKFLOW_VERSION = "1.0"; public static final String ACTIVITY = "HelloActivity"; public static final String ACTIVITY_VERSION = "1.0";
Questi valori verranno utilizzati in tutto il codice.
-
Dopo le dichiarazioni String, create un'istanza della AmazonSimpleWorkflowClientclasse. Questa è l'interfaccia di base per i Amazon SWF metodi forniti daAWS SDK for Java.
private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
Lo snippet precedente presuppone che le credenziali temporanee siano associate al profilo.
default
Se usi un profilo diverso, modifica il codice precedente come segue e sostituisciprofile_name con il nome
del nome effettivo del profilo.private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder .standard() .withCredentials(new ProfileCredentialsProvider("
profile_name
")) .withRegion(Regions.DEFAULT_REGION) .build(); -
Aggiungete una nuova funzione per registrare un dominio SWF. Un dominio è un contenitore logico per una serie di attività SWF e tipi di flussi di lavoro correlati. I componenti SWF possono comunicare tra loro solo se esistono all'interno dello stesso dominio.
try { System.out.println("** Registering the domain '" + DOMAIN + "'."); swf.registerDomain(new RegisterDomainRequest() .withName(DOMAIN) .withWorkflowExecutionRetentionPeriodInDays("1")); } catch (DomainAlreadyExistsException e) { System.out.println("** Domain already exists!"); }
Quando registri un dominio, gli fornisci un nome (qualsiasi set da 1 a 256 caratteri esclusi
:
,,/
|
, i caratteri di controllo o la stringa letterale '`arn') e un periodo di conservazione, che è il numero di giorni in cui Amazon SWF verranno conservati i dati della cronologia di esecuzione del flusso di lavoro dopo il completamento dell'esecuzione di un flusso di lavoro. Il periodo massimo di conservazione dell'esecuzione del flusso di lavoro massimo è di 90 giorni. RegisterDomainRequestPer ulteriori informazioni, consulta.Se esiste già un dominio con quel nome, DomainAlreadyExistsExceptionviene generato un. Poiché non ci interessa se il dominio è già stato creato, possiamo ignorare l'eccezione.
Nota
Questo codice dimostra uno schema comune quando si lavora con i AWS SDK for Java metodi, i dati per il metodo sono forniti da una classe nello
simpleworkflow.model
spazio dei nomi, che viene istanziata e compilata utilizzando i metodi concatenabili.0—with*
-
Aggiungi una funzione per registrare un nuovo tipo di attività. Un'attività rappresenta un'unità di lavoro nel flusso di lavoro.
try { System.out.println("** Registering the activity type '" + ACTIVITY + "-" + ACTIVITY_VERSION + "'."); swf.registerActivityType(new RegisterActivityTypeRequest() .withDomain(DOMAIN) .withName(ACTIVITY) .withVersion(ACTIVITY_VERSION) .withDefaultTaskList(new TaskList().withName(TASKLIST)) .withDefaultTaskScheduleToStartTimeout("30") .withDefaultTaskStartToCloseTimeout("600") .withDefaultTaskScheduleToCloseTimeout("630") .withDefaultTaskHeartbeatTimeout("10")); } catch (TypeAlreadyExistsException e) { System.out.println("** Activity type already exists!"); }
Un tipo di attività è identificato da un nome e da una versione, che vengono utilizzati per identificare in modo univoco l'attività rispetto a qualsiasi altra nel dominio in cui è registrata. Le attività contengono anche una serie di parametri opzionali, come l'elenco delle attività predefinito utilizzato per ricevere attività e dati da SWF e una serie di timeout diversi che è possibile utilizzare per porre vincoli sulla durata delle diverse parti dell'esecuzione dell'attività. RegisterActivityTypeRequestPer ulteriori informazioni, consulta.
Nota
Tutti i valori di timeout sono specificati in secondi. Vedi Tipi di Amazon SWF timeout per una descrizione completa di come i timeout influiscono sulle esecuzioni del flusso di lavoro.
Se il tipo di attività che stai cercando di registrare esiste già, TypeAlreadyExistsExceptionviene generato un. Aggiungi una funzione per registrare un nuovo tipo di flusso di lavoro. Un flusso di lavoro, noto anche come decisore, rappresenta la logica di esecuzione del flusso di lavoro.
+
try { System.out.println("** Registering the workflow type '" + WORKFLOW + "-" + WORKFLOW_VERSION + "'."); swf.registerWorkflowType(new RegisterWorkflowTypeRequest() .withDomain(DOMAIN) .withName(WORKFLOW) .withVersion(WORKFLOW_VERSION) .withDefaultChildPolicy(ChildPolicy.TERMINATE) .withDefaultTaskList(new TaskList().withName(TASKLIST)) .withDefaultTaskStartToCloseTimeout("30")); } catch (TypeAlreadyExistsException e) { System.out.println("** Workflow type already exists!"); }
+
Analogamente ai tipi di attività, i tipi di flusso di lavoro sono identificati da un nome e una versione e dispongono anche di timeout configurabili. RegisterWorkflowTypeRequestPer ulteriori informazioni, consulta.
+
Se il tipo di flusso di lavoro che stai cercando di registrare esiste già, TypeAlreadyExistsExceptionviene generato un. Infine, rendi la classe eseguibile fornendole un main
metodo che registrerà a sua volta il dominio, il tipo di attività e il tipo di flusso di lavoro:
+
registerDomain(); registerWorkflowType(); registerActivityType();
Ora puoi creare ed eseguire l'applicazione per eseguire lo script di registrazione o continuare con la codifica degli addetti all'attività e al flusso di lavoro. Una volta registrati il dominio, il flusso di lavoro e l'attività, non sarà necessario eseguirli nuovamente: questi tipi persistono finché non li dichiarerai obsoleti tu stesso.
Implementa l'operatore delle attività
Un'attività è l'unità di lavoro di base in un flusso di lavoro. Un flusso di lavoro fornisce la logica, la pianificazione delle attività da eseguire (o altre azioni da intraprendere) in risposta alle attività decisionali. Un flusso di lavoro tipico è in genere costituito da una serie di attività che possono essere eseguite in modo sincrono, asincrono o una combinazione di entrambi.
L'activity worker è la parte di codice che analizza le attività generate Amazon SWF in risposta alle decisioni del flusso di lavoro. Quando riceve un'attività, esegue l'attività corrispondente e restituisce una risposta di successo/fallimento al flusso di lavoro.
Implementeremo un semplice operatore che gestisca una singola attività.
-
Apri il tuo editor di testo e crea il file
ActivityWorker.java
, aggiungi una dichiarazione di pacchetto e importa secondo i passaggi più comuni.import com.amazonaws.regions.Regions; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder; import com.amazonaws.services.simpleworkflow.model.*;
-
Aggiungi la
ActivityWorker
classe al file e assegnagli un membro dei dati per contenere un client SWF con Amazon SWF cui interagire:private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
-
Aggiungi il metodo che useremo come attività:
private static String sayHello(String input) throws Throwable { return "Hello, " + input + "!"; }
L'attività prende semplicemente una stringa, la combina in un saluto e restituisce il risultato. Sebbene ci siano poche possibilità che questa attività generi un'eccezione, è consigliabile progettare attività che possano generare un errore se qualcosa va storto.
-
Aggiungi un
main
metodo che useremo come metodo di polling delle attività. Inizieremo aggiungendo del codice per sondare l'elenco delle attività relative alle attività:System.out.println("Polling for an activity task from the tasklist '" + HelloTypes.TASKLIST + "' in the domain '" + HelloTypes.DOMAIN + "'."); ActivityTask task = swf.pollForActivityTask( new PollForActivityTaskRequest() .withDomain(HelloTypes.DOMAIN) .withTaskList( new TaskList().withName(HelloTypes.TASKLIST))); String task_token = task.getTaskToken();
L'attività riceve le attività Amazon SWF richiamando il
pollForActivityTask
metodo del client SWF, specificando il dominio e l'elenco delle attività da utilizzare nel passaggio. PollForActivityTaskRequestUna volta ricevuta un'attività, ne riceviamo un identificatore univoco chiamando il metodo dell'
getTaskToken
attività. -
Quindi, scrivi del codice per elaborare le attività che arrivano. Aggiungi quanto segue al tuo
main
metodo, subito dopo il codice che esegue il sondaggio per l'attività e ne recupera il token.if (task_token != null) { String result = null; Throwable error = null; try { System.out.println("Executing the activity task with input '" + task.getInput() + "'."); result = sayHello(task.getInput()); } catch (Throwable th) { error = th; } if (error == null) { System.out.println("The activity task succeeded with result '" + result + "'."); swf.respondActivityTaskCompleted( new RespondActivityTaskCompletedRequest() .withTaskToken(task_token) .withResult(result)); } else { System.out.println("The activity task failed with the error '" + error.getClass().getSimpleName() + "'."); swf.respondActivityTaskFailed( new RespondActivityTaskFailedRequest() .withTaskToken(task_token) .withReason(error.getClass().getSimpleName()) .withDetails(error.getMessage())); } }
Se il task token non lo è
null
, possiamo iniziare a eseguire il metodo activity (sayHello
), fornendogli i dati di input inviati con l'attività.Se l'operazione è riuscita (non è stato generato alcun errore), il worker risponde a SWF chiamando il
respondActivityTaskCompleted
metodo del client SWF con un RespondActivityTaskCompletedRequestoggetto contenente il token dell'attività e i dati dei risultati dell'attività.D'altra parte, se l'attività non è riuscita, rispondiamo chiamando il
respondActivityTaskFailed
metodo con un RespondActivityTaskFailedRequestoggetto, passandogli il token dell'attività e le informazioni sull'errore.
Nota
Questa attività non si interromperà correttamente se viene uccisa. Sebbene non rientri nello scopo di questo tutorial, un'implementazione alternativa di questo activity worker è fornita nell'argomento di accompagnamento, Shutting Down Activity and Workflow Workers con garbo.
Impilare l'operatore del flusso di lavoro
La logica del flusso di lavoro risiede in un pezzo di codice noto come workflow worker. Il workflow worker effettua un sondaggio per le attività decisionali inviate dal dominio e dall'elenco di attività predefinito Amazon SWF in cui è stato registrato il tipo di flusso di lavoro.
Quando il lavoratore del flusso di lavoro riceve un'attività, prende una sorta di decisione (in genere se pianificare o meno una nuova attività) e intraprende un'azione appropriata (come la pianificazione dell'attività).
-
Apri il tuo editor di testo e crea il file
WorkflowWorker.java
, aggiungi una dichiarazione di pacchetto e importa secondo i passaggi più comuni. -
Aggiungi alcune importazioni aggiuntive al file:
import com.amazonaws.regions.Regions; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder; import com.amazonaws.services.simpleworkflow.model.*; import java.util.ArrayList; import java.util.List; import java.util.UUID;
-
Dichiarate la
WorkflowWorker
classe e create un'istanza della AmazonSimpleWorkflowClientclasse utilizzata per accedere ai metodi SWF.private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
-
Aggiungi il
main
metodo. Il metodo si ripete continuamente, esaminando le attività decisionali utilizzando il metodo del client SWF.pollForDecisionTask
PollForDecisionTaskRequestFornisce i dettagli.PollForDecisionTaskRequest task_request = new PollForDecisionTaskRequest() .withDomain(HelloTypes.DOMAIN) .withTaskList(new TaskList().withName(HelloTypes.TASKLIST)); while (true) { System.out.println( "Polling for a decision task from the tasklist '" + HelloTypes.TASKLIST + "' in the domain '" + HelloTypes.DOMAIN + "'."); DecisionTask task = swf.pollForDecisionTask(task_request); String taskToken = task.getTaskToken(); if (taskToken != null) { try { executeDecisionTask(taskToken, task.getEvents()); } catch (Throwable th) { th.printStackTrace(); } } }
Una volta ricevuta un'attività, chiamiamo il suo
getTaskToken
metodo, che restituisce una stringa che può essere utilizzata per identificare l'attività. Se il token restituito non lo ènull
, lo elaboriamo ulteriormente nelexecuteDecisionTask
metodo, passandogli il task token e l'elenco degli HistoryEventoggetti inviati con l'attività. -
Aggiungi il
executeDecisionTask
metodo, prendendo il task token (aString
) e l'HistoryEvent
elenco.List<Decision> decisions = new ArrayList<Decision>(); String workflow_input = null; int scheduled_activities = 0; int open_activities = 0; boolean activity_completed = false; String result = null;
Abbiamo anche impostato alcuni membri dei dati per tenere traccia di cose come:
-
Un elenco di oggetti Decision utilizzati per riportare i risultati dell'elaborazione dell'attività.
-
Una stringa per contenere l'input del flusso di lavoro fornito dall'evento WorkflowExecutionStarted "»
-
un conteggio delle attività pianificate e aperte (in esecuzione) per evitare di pianificare la stessa attività quando è già stata pianificata o è attualmente in esecuzione.
-
un valore booleano per indicare che l'attività è stata completata.
-
Una stringa per contenere i risultati dell'attività, per restituirli come risultato del nostro flusso di lavoro.
-
-
Quindi, aggiungi del codice
executeDecisionTask
per elaborare gliHistoryEvent
oggetti inviati con l'attività, in base al tipo di evento riportato dalgetEventType
metodo.System.out.println("Executing the decision task for the history events: ["); for (HistoryEvent event : events) { System.out.println(" " + event); switch(event.getEventType()) { case "WorkflowExecutionStarted": workflow_input = event.getWorkflowExecutionStartedEventAttributes() .getInput(); break; case "ActivityTaskScheduled": scheduled_activities++; break; case "ScheduleActivityTaskFailed": scheduled_activities--; break; case "ActivityTaskStarted": scheduled_activities--; open_activities++; break; case "ActivityTaskCompleted": open_activities--; activity_completed = true; result = event.getActivityTaskCompletedEventAttributes() .getResult(); break; case "ActivityTaskFailed": open_activities--; break; case "ActivityTaskTimedOut": open_activities--; break; } } System.out.println("]");
Ai fini del nostro flusso di lavoro, siamo molto interessati a:
-
l'evento WorkflowExecutionStarted "", che indica che l'esecuzione del flusso di lavoro è iniziata (in genere significa che è necessario eseguire la prima attività del flusso di lavoro) e che fornisce l'input iniziale fornito al flusso di lavoro. In questo caso, è la parte relativa al nome del nostro saluto, quindi viene salvata in una stringa da utilizzare quando si pianifica l'esecuzione dell'attività.
-
l'evento ActivityTaskCompleted "", che viene inviato una volta completata l'attività pianificata. I dati dell'evento includono anche il valore restituito dall'attività completata. Poiché abbiamo solo un'attività, utilizzeremo quel valore come risultato dell'intero flusso di lavoro.
Gli altri tipi di eventi possono essere utilizzati se il flusso di lavoro li richiede. Vedi la descrizione della HistoryEventclasse per informazioni su ogni tipo di evento.
+ NOTA: le stringhe nelle
switch
istruzioni sono state introdotte in Java 7. Se stai usando una versione precedente di Java, puoi utilizzare la EventTypeclasse per convertire il valoreString
restituitohistory_event.getType()
da in un valore enum e poi di nuovo in un,String
se necessario: -
EventType et = EventType.fromValue(event.getEventType());
-
Dopo la
switch
dichiarazione, aggiungi altro codice per rispondere con una decisione appropriata in base all'attività ricevuta.if (activity_completed) { decisions.add( new Decision() .withDecisionType(DecisionType.CompleteWorkflowExecution) .withCompleteWorkflowExecutionDecisionAttributes( new CompleteWorkflowExecutionDecisionAttributes() .withResult(result))); } else { if (open_activities == 0 && scheduled_activities == 0) { ScheduleActivityTaskDecisionAttributes attrs = new ScheduleActivityTaskDecisionAttributes() .withActivityType(new ActivityType() .withName(HelloTypes.ACTIVITY) .withVersion(HelloTypes.ACTIVITY_VERSION)) .withActivityId(UUID.randomUUID().toString()) .withInput(workflow_input); decisions.add( new Decision() .withDecisionType(DecisionType.ScheduleActivityTask) .withScheduleActivityTaskDecisionAttributes(attrs)); } else { // an instance of HelloActivity is already scheduled or running. Do nothing, another // task will be scheduled once the activity completes, fails or times out } } System.out.println("Exiting the decision task with the decisions " + decisions);
-
Se l'attività non è ancora stata programmata, rispondiamo con una
ScheduleActivityTask
decisione, che fornisce informazioni in una ScheduleActivityTaskDecisionAttributesstruttura sull'attività da programmare successiva, compresi anche i dati da Amazon SWF inviare all'attività. Amazon SWF -
Se l'attività è stata completata, consideriamo completato l'intero flusso di lavoro e rispondiamo con una
CompletedWorkflowExecution
decisione, compilando una CompleteWorkflowExecutionDecisionAttributesstruttura per fornire dettagli sul flusso di lavoro completato. In questo caso, restituiamo il risultato dell'attività.
In entrambi i casi, le informazioni sulla decisione vengono aggiunte all'
Decision
elenco dichiarato all'inizio del metodo. -
-
Completa l'attività decisionale restituendo l'elenco degli
Decision
oggetti raccolti durante l'elaborazione dell'attività. Aggiungi questo codice alla fine delexecuteDecisionTask
metodo che abbiamo scritto:swf.respondDecisionTaskCompleted( new RespondDecisionTaskCompletedRequest() .withTaskToken(taskToken) .withDecisions(decisions));
Il
respondDecisionTaskCompleted
metodo del client SWF utilizza il token dell'operazione che identifica l'operazione e l'elenco diDecision
oggetti.
Implementazione del flusso di lavoro
Infine, scriveremo del codice per avviare l'esecuzione del flusso di lavoro.
-
Apri il tuo editor di testo e crea il file
WorkflowStarter.java
, aggiungi una dichiarazione di pacchetto e importa secondo i passaggi più comuni. -
Aggiungi la
WorkflowStarter
classe:package aws.example.helloswf; import com.amazonaws.regions.Regions; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder; import com.amazonaws.services.simpleworkflow.model.*; public class WorkflowStarter { private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build(); public static final String WORKFLOW_EXECUTION = "HelloWorldWorkflowExecution"; public static void main(String[] args) { String workflow_input = "{SWF}"; if (args.length > 0) { workflow_input = args[0]; } System.out.println("Starting the workflow execution '" + WORKFLOW_EXECUTION + "' with input '" + workflow_input + "'."); WorkflowType wf_type = new WorkflowType() .withName(HelloTypes.WORKFLOW) .withVersion(HelloTypes.WORKFLOW_VERSION); Run run = swf.startWorkflowExecution(new StartWorkflowExecutionRequest() .withDomain(HelloTypes.DOMAIN) .withWorkflowType(wf_type) .withWorkflowId(WORKFLOW_EXECUTION) .withInput(workflow_input) .withExecutionStartToCloseTimeout("90")); System.out.println("Workflow execution started with the run id '" + run.getRunId() + "'."); } }
La
WorkflowStarter
classe è costituita da un singolo metodomain
, che accetta un argomento opzionale passato alla riga di comando come dati di input per il flusso di lavoro.Il metodo client SWF
startWorkflowExecution
, accetta un StartWorkflowExecutionRequestoggetto come input. Qui, oltre a specificare il dominio e il tipo di flusso di lavoro da eseguire, forniamo:-
un nome di esecuzione del flusso di lavoro leggibile dall'uomo
-
dati di input del flusso di lavoro (forniti nella riga di comando nel nostro esempio)
-
un valore di timeout che rappresenta il tempo, in secondi, che l'intero flusso di lavoro dovrebbe impiegare per l'esecuzione.
L'oggetto Run che
startWorkflowExecution
restituisce fornisce un ID di esecuzione, un valore che può essere utilizzato per identificare l'esecuzione di questo particolare flusso di lavoro nella Amazon SWF cronologia delle esecuzioni del flusso di lavoro.+ NOTA: l'ID di esecuzione è generato da Amazon SWF e non è uguale al nome di esecuzione del flusso di lavoro che fornisci all'avvio dell'esecuzione del flusso di lavoro.
-
Compilare l'esempio
Per creare il progetto di esempio con Maven, vai alla helloswf
directory e digita:
mvn package
Il risultato helloswf-1.0.jar
verrà generato nella target
directory.
Esecuzione dell'esempio
L'esempio è costituito da quattro classi eseguibili separate, che vengono eseguite indipendentemente l'una dall'altra.
Nota
Se utilizzi un sistema Linux, macOS o Unix, puoi eseguirli tutti, uno dopo l'altro, in un'unica finestra di terminale. Se si utilizza Windows, è necessario aprire due istanze della riga di comando aggiuntive e accedere alla helloswf
directory contenuta in ciascuna di esse.
Impostazione del percorso di classe Java
Sebbene Maven abbia gestito le dipendenze per te, per eseguire l'esempio, dovrai fornire la libreria AWS SDK e le sue dipendenze dal tuo classpath Java. Puoi impostare la variabile di CLASSPATH
ambiente sulla posizione delle tue librerie AWS SDK e sulla third-party/lib
directory nell'SDK, che include le dipendenze necessarie:
export CLASSPATH='target/helloswf-1.0.jar:/path/to/sdk/lib/*:/path/to/sdk/third-party/lib/*' java example.swf.hello.HelloTypes
oppure usa l'-cp
opzione del
java
comando per impostare il classpath durante l'esecuzione di ogni applicazione.
java -cp target/helloswf-1.0.jar:/path/to/sdk/lib/*:/path/to/sdk/third-party/lib/* \ example.swf.hello.HelloTypes
Lo stile che usi dipende da te. Se non avete avuto problemi a creare il codice, provate entrambi a eseguire gli esempi e ottenete una serie di errori "NoClassDefFound", probabilmente perché il classpath è impostato in modo errato.
Registrazione del tipo di attività,
Prima di gestire i tuoi worker e il workflow starter, dovrai registrare il dominio e il tuo flusso di lavoro e i tipi di attività. Il codice per eseguire questa operazione è stato implementato in Registra un dominio, flusso di lavoro e tipi di attività.
Dopo la creazione, e se hai impostato CLASSPATH, puoi eseguire il codice di registrazione eseguendo il comando:
echo 'Supply the name of one of the example classes as an argument.'
Avvia l'attività e i lavoratori del flusso di lavoro
Ora che i tipi sono stati registrati, puoi avviare i lavoratori dell'attività e del flusso di lavoro. Queste continueranno a funzionare e a eseguire il sondaggio delle attività fino a quando non verranno eliminate, quindi dovresti eseguirle in finestre di terminale separate oppure, se stai usando Linux, macOS o Unix, puoi usare l'&
operatore per far sì che ognuna di esse generi un processo separato durante l'esecuzione.
echo 'If there are arguments to the class, put them in quotes after the class name.' exit 1
Se esegui questi comandi in finestre separate, ometti l'&
operatore finale da ogni riga.
Avvia l'esecuzione del flusso di lavoro
Ora che gli addetti all'attività e al flusso di lavoro stanno effettuando un sondaggio, puoi avviare l'esecuzione del flusso di lavoro. Questo processo verrà eseguito fino a quando il flusso di lavoro non restituirà lo stato completato. Dovresti eseguirlo in una nuova finestra di terminale (a meno che tu non esegua i tuoi lavoratori come nuovi processi generati utilizzando l'&
operatore).
fi
Nota
Se desideri fornire i tuoi dati di input, che verranno passati prima al flusso di lavoro e poi all'attività, aggiungili alla riga di comando. Ad esempio:
echo "## Running $className..."
Una volta avviata l'esecuzione del flusso di lavoro, dovresti iniziare a vedere l'output fornito da entrambi i lavoratori e dall'esecuzione del flusso di lavoro stesso. Al termine del flusso di lavoro, il relativo output verrà stampato sullo schermo.
Fonte completa per questo esempio
Puoi sfogliare il codice sorgente completo
Ulteriori informazioni
-
I lavoratori qui presentati possono comportare la perdita di attività se vengono fermati mentre è ancora in corso un sondaggio sul flusso di lavoro. Per scoprire come chiudere correttamente i lavoratori, vedi Chiusura regolare dei lavoratori di Activity and Workflow Workflow.
-
Per ulteriori informazioniAmazon SWF, visita la Amazon SWF
home page o visualizza la Guida per gli Amazon SWF sviluppatori. -
Puoi usare AWS Flow Framework for Java per scrivere flussi di lavoro più complessi in un elegante stile Java usando le annotazioni. Per ulteriori informazioni, consulta la Guida AWS Flow Framework per gli sviluppatori di Java.