Creazione di un'Amazon SWFapplicazione semplice - AWS SDK for Java 1. x

La AWS SDK for Java versione 1.x è entrata in modalità manutenzione il 31 luglio 2024 e sarà disponibile il 31 end-of-supportdicembre 2025. Ti consigliamo di eseguire la migrazione a per continuare AWS SDK for Java 2.xa ricevere nuove funzionalità, miglioramenti della disponibilità e aggiornamenti di sicurezza.

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 SWFapplicazioni conAWS SDK for Java, presentando nel contempo alcuni concetti importanti.

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.

  • Apache Maven.

  • 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

  1. 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.

  2. 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>
  3. 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:

  1. Crea il file nella src/main/java/aws/example/helloswf/ directory del progetto.

  2. Aggiungi una package dichiarazione all'inizio di ogni file per dichiararne lo spazio dei nomi. Il progetto di esempio utilizza:

    package aws.example.helloswf;
  3. Aggiungi import dichiarazioni per la AmazonSimpleWorkflowClientclasse e per più classi nel com.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à.

  1. Apri il tuo editor di testo e crea il fileHelloTypes.java, aggiungi una dichiarazione di pacchetto e importa secondo i passaggi più comuni.

  2. 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.

  3. 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 sostituisci profile_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();
  4. 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*

  5. 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à.

  1. Apri il tuo editor di testo e crea il fileActivityWorker.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.*;
  2. 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();
  3. 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.

  4. 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. PollForActivityTaskRequest

    Una volta ricevuta un'attività, ne riceviamo un identificatore univoco chiamando il metodo dell'getTaskTokenattività.

  5. 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à).

  1. Apri il tuo editor di testo e crea il fileWorkflowWorker.java, aggiungi una dichiarazione di pacchetto e importa secondo i passaggi più comuni.

  2. 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;
  3. 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();
  4. 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 nel executeDecisionTask metodo, passandogli il task token e l'elenco degli HistoryEventoggetti inviati con l'attività.

  5. Aggiungi il executeDecisionTask metodo, prendendo il task token (aString) e l'HistoryEventelenco.

    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.

  6. Quindi, aggiungi del codice executeDecisionTask per elaborare gli HistoryEvent oggetti inviati con l'attività, in base al tipo di evento riportato dal getEventType 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 valore String restituito history_event.getType() da in un valore enum e poi di nuovo in un, String se necessario:

EventType et = EventType.fromValue(event.getEventType());
  1. 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'Decisionelenco dichiarato all'inizio del metodo.

  2. Completa l'attività decisionale restituendo l'elenco degli Decision oggetti raccolti durante l'elaborazione dell'attività. Aggiungi questo codice alla fine del executeDecisionTask 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 di Decision oggetti.

Implementazione del flusso di lavoro

Infine, scriveremo del codice per avviare l'esecuzione del flusso di lavoro.

  1. Apri il tuo editor di testo e crea il fileWorkflowStarter.java, aggiungi una dichiarazione di pacchetto e importa secondo i passaggi più comuni.

  2. 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 SWFstartWorkflowExecution, 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'-cpopzione 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 di questo esempio su Github nel aws-java-developer-guiderepository.

Ulteriori informazioni