Création d'une Amazon SWF application simple - AWS SDK for Java 1. x

La AWS SDK for Java version 1.x est entrée en mode maintenance le 31 juillet 2024 et atteindra end-of-supportle 31 décembre 2025. Nous vous recommandons de migrer vers le pour continuer AWS SDK for Java 2.xà bénéficier des nouvelles fonctionnalités, des améliorations de disponibilité et des mises à jour de sécurité.

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Création d'une Amazon SWF application simple

Cette rubrique vous présentera la programmation d'Amazon SWFapplications avec leAWS SDK for Java, tout en présentant quelques concepts importants en cours de route.

À propos de l'exemple

L'exemple de projet créera un flux de travail avec une seule activité qui accepte les données du flux de travail transmises via le AWS cloud (selon la traditionHelloWorld, ce sera le nom de la personne à saluer), puis imprime un message d'accueil en réponse.

Si cela semble très simple au premier abord, les applications Amazon SWF sont constituées de différentes parties qui fonctionnent ensemble :

  • Un domaine, utilisé comme conteneur logique pour vos données d'exécution de flux de travail.

  • Un ou plusieurs flux de travail représentant des composants de code qui définissent l'ordre logique de l'exécution des activités du flux de travail et des flux de travail enfants.

  • Un travail de flux de travail, également appelé décideur, qui recherche les tâches de décision et planifie des activités ou des flux de travail enfants en réponse.

  • Une ou plusieurs activités, chacune représentant une unité de travail dans le flux de travail.

  • Un travail d'activité qui recherche les tâches d'activité et exécute des méthodes d'activité en réponse.

  • Une ou plusieurs listes de tâches, qui sont des files d'attente gérées par Amazon SWF servant à envoyer des demandes aux travaux de flux de travail et d'activité. Les tâches d'une liste de tâches destinées aux travaux de flux de travail sont appelées tâches de décision. Celles destinées aux travaux d'activité sont appelées tâches d'activité.

  • Un démarreur de flux de travail qui démarre l'exécution de votre flux de travail.

Dans les coulisses, Amazon SWF orchestre le fonctionnement de ces composants, coordonne leur flux depuis le AWS cloud, transmet des données entre eux, gère les délais d'attente et les notifications de pulsations, et enregistre l'historique d'exécution du flux de travail.

Prérequis

Environnement de développement

L'environnement de développement utilisé dans ce didacticiel comprend les éléments suivants :

  • La valeur AWS SDK for Java.

  • Apache Maven (3.3.1).

  • JDK 1.7 ou version ultérieure. Ce didacticiel a été développé et testé à l'aide de JDK 1.8.0.

  • Un éditeur de texte Java efficace (de votre choix).

Note

Si vous utilisez un système de génération différent de celui de Maven, vous pouvez toujours créer un projet en suivant les étapes appropriées à votre environnement et en utilisant les concepts fournis ici pour poursuivre. Vous trouverez plus d'informations sur la configuration et l'utilisation du kit AWS SDK for Java avec différents systèmes de génération dans Mise en route.

De même, mais avec plus d'efforts, les étapes présentées ici peuvent être mises en œuvre à l'aide de n'importe quel AWS SDK compatible avec. Amazon SWF

Toutes les dépendances externes nécessaires sont incluses avec le kit AWS SDK for Java. Vous n'avez donc aucun élément supplémentaire à télécharger.

AWSAccès

Pour suivre correctement ce didacticiel, vous devez avoir accès au portail AWS d'accès comme décrit dans la section de configuration de base de ce guide.

Les instructions décrivent comment accéder aux informations d'identification temporaires que vous copiez et collez dans votre credentials fichier partagé local. Les informations d'identification temporaires que vous collez doivent être associées à un rôle IAM autorisé à accéder à Amazon SWF. AWS IAM Identity Center Après avoir collé les informations d'identification temporaires, votre credentials fichier ressemblera à ce qui suit.

[default] aws_access_key_id=AKIAIOSFODNN7EXAMPLE aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY aws_session_token=IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZ2luX2IQoJb3JpZVERYLONGSTRINGEXAMPLE

Ces informations d'identification temporaires sont associées au default profil.

Création d'un projet SWF

  1. Démarrez un nouveau projet avec Maven :

    mvn archetype:generate -DartifactId=helloswf \ -DgroupId=aws.example.helloswf -DinteractiveMode=false

    Cela permet de créer un nouveau projet avec une structure de projet Maven standard :

    helloswf ├── pom.xml └── src ├── main │   └── java │   └── aws │   └── example │   └── helloswf │   └── App.java └── test └── ...

    Vous pouvez ignorer ou supprimer le répertoire test et tout ce qu'il contient, car nous ne l'utiliserons pas pour ce didacticiel. Vous pouvez également supprimer App.java, car nous le remplacerons par de nouvelles classes.

  2. Modifiez le pom.xml fichier du projet et ajoutez le aws-java-sdk-simpleworkflowmodule en ajoutant une dépendance correspondante dans le <dependencies> bloc.

    <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-simpleworkflow</artifactId> <version>1.11.1000</version> </dependency> </dependencies>
  3. Assurez-vous que Maven génère votre projet avec JDK 1.7 ou version ultérieure. Ajoutez les éléments suivants à votre projet (avant ou après le bloc <dependencies>) dans pom.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>

Codage du projet

L'exemple de projet est composé de quatre applications distinctes que nous allons examiner une par une :

  • HelloTypes.java --contient les données de domaine, d'activité et de type de flux de travail du projet, partagées avec les autres composants. Gère également l'enregistrement de ces types auprès de SWF.

  • ActivityWorker.java --contient le moteur d'activité, qui interroge les tâches d'activité et exécute les activités en réponse.

  • WorkflowWorker.java --contient le workflow worker (décideur), qui interroge les tâches de décision et planifie de nouvelles activités.

  • WorkflowStarter.java --contient le démarreur du flux de travail, qui lance l'exécution d'un nouveau flux de travail, ce qui amène SWF à générer des tâches de décision et de flux de travail destinées à vos collaborateurs.

Étapes communes pour tous les fichiers source

Tous les fichiers que vous créez pour héberger vos classes Java présentent quelques points communs. Par souci de concision, ces étapes sont implicites chaque fois que vous ajoutez un nouveau fichier au projet :

  1. Créez le fichier dans le répertoire src/main/java/aws/example/helloswf/ du projet.

  2. Ajoutez une déclaration package au début de chaque fichier pour déclarer son espace de noms. L'exemple de projet utilise :

    package aws.example.helloswf;
  3. Ajoutez import des déclarations pour la AmazonSimpleWorkflowClientclasse et pour plusieurs classes dans l'espace de com.amazonaws.services.simpleworkflow.model nommage. Pour simplifier, nous utilisons :

    import com.amazonaws.regions.Regions; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder; import com.amazonaws.services.simpleworkflow.model.*;

Enregistrement d'un domaine, et de types de flux de travail et d'activité

Nous allons commencer par créer une nouvelle classe exécutable, HelloTypes.java. Ce fichier contient des données partagées que les différentes parties de votre flux de travail doivent connaître, comme le nom et la version des types d'activité et de flux de travail, le nom du domaine et le nom de la liste de tâches.

  1. Ouvrez votre éditeur de texte et créez le fichier HelloTypes.java, en ajoutant une déclaration de package et des déclarations d'importation conformément aux étapes courantes.

  2. Déclarez la classe HelloTypes et fournissez-lui des valeurs à utiliser pour vos types d'activité et de flux de travail enregistrés :

    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";

    Ces valeurs seront utilisées dans l'ensemble du code.

  3. Après les déclarations String, créez une instance de la AmazonSimpleWorkflowClientclasse. Il s'agit de l'interface de base pour les méthodes Amazon SWF fournies par le kit AWS SDK for Java.

    private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();

    L'extrait de code précédent suppose que des informations d'identification temporaires sont associées au default profil. Si vous utilisez un profil différent, modifiez le code ci-dessus comme suit et remplacez profile_name par le nom du profil actuel.

    private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder .standard() .withCredentials(new ProfileCredentialsProvider("profile_name")) .withRegion(Regions.DEFAULT_REGION) .build();
  4. Ajoutez une nouvelle fonction pour enregistrer un domaine SWF. Un domaine est un conteneur logique pour différents types d'activité et de flux de travail SWF associés. Les composants SWF ne peuvent communiquer entre eux que s'ils sont situés dans le même domaine.

    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!"); }

    Lorsque vous enregistrez un domaine, vous lui fournissez un nom (un ensemble de 1 à 256 caractères : /|, à l'exclusion des caractères de contrôle ou de la chaîne littérale « arn ») et une période de conservation, qui correspond au nombre de jours pendant lesquels les données d'historique d'exécution de votre flux de travail Amazon SWF seront conservées une fois l'exécution d'un flux de travail terminée. La période de conservation maximale pour les exécutions de flux de travail est de 90 jours. RegisterDomainRequestPour plus d'informations, voir.

    Si un domaine portant ce nom existe déjà, un DomainAlreadyExistsExceptionest généré. Comme cela ne pose aucun problème si le domaine a déjà été créé, nous pouvons ignorer cette exception.

    Note

    Ce code illustre un modèle courant lorsque des méthodes AWS SDK for Java sont utilisées. Les données de la méthode sont fournies par une classe dans l'espace de noms simpleworkflow.model, que vous instanciez et remplissez à l'aide des méthodes –0—with* chaînables.

  5. Ajoutez une fonction pour enregistrer un nouveau type d'activité. Une activité représente une unité de travail de votre flux de travail.

    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 type d'activité est identifié par un nom et une version, qui sont utilisés pour identifier l'activité de façon unique parmi toutes les autres activités du domaine dans lequel cette activité est enregistrée. Les activités contiennent également différents paramètres facultatifs, comme la liste de tâches par défaut utilisée pour recevoir des tâches et des données provenant de SWF, ainsi que différents délais d'expiration permettant d'appliquer des contraintes quant à la durée de l'exécution de différentes parties de l'activité. RegisterActivityTypeRequestPour plus d'informations, voir.

    Note

    Toues les valeurs de délai sont spécifiées en secondes. Consultez la section Types de Amazon SWF délais d'expiration pour une description complète de la façon dont les délais d'expiration affectent l'exécution de votre flux de travail.

Si le type d'activité que vous essayez d'enregistrer existe déjà, un TypeAlreadyExistsExceptionest déclenché. Ajoutez une fonction pour enregistrer un nouveau type de flux de travail. Un flux de travail, également appelé décideur, représente la logique de l'exécution de votre flux de travail.

+

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!"); }

+

À l'instar de types d'activité, les types de flux de travail sont identifiés par un nom et une version, et sont également associés à des délais d'expiration configurables. RegisterWorkflowTypeRequestPour plus d'informations, voir.

+

Si le type de flux de travail que vous essayez d'enregistrer existe déjà, un TypeAlreadyExistsExceptionest déclenché. Enfin, rendez la classe exécutable en lui fournissant une méthode main qui enregistre à son tour le domaine, le type d'activité et le type de flux de travail :

+

registerDomain(); registerWorkflowType(); registerActivityType();

Vous pouvez créer et exécuter l'application maintenant pour exécuter le script d'enregistrement, ou continuer à coder les travaux d'activité et de flux de travail. Une fois que le domaine, le flux de travail et l'activité ont été enregistrés, vous n'avez pas besoin de les exécuter à nouveau. Ces types persistent jusqu'à ce que vous les supprimiez vous-même.

Implémentation du travail d'activité

Une activité est l'unité de travail de base d'un flux de travail. Un flux de travail fournit la logique en planifiant les activités à exécuter (ou les autres actions à effectuer) en réponse à des tâches de décision. Un flux de travail classique comporte généralement différentes activités qui peuvent s'exécuter de façon synchrone ou asynchrone, ou avec une combinaison de ces deux modes.

Le travail d'activité est le fragment de code qui recherche les tâches d'activité qui sont générées par Amazon SWF en réponse à des décisions de flux de travail. Lorsque ce travail reçoit une tâche d'activité, il exécute l'activité correspondante et renvoie une réponse de réussite/échec au flux de travail.

Nous allons implémenter un travail d'activité simple qui traite une activité unique.

  1. Ouvrez votre éditeur de texte et créez le fichier ActivityWorker.java, en ajoutant une déclaration de package et des déclarations d'importation conformément aux étapes courantes.

    import com.amazonaws.regions.Regions; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClientBuilder; import com.amazonaws.services.simpleworkflow.model.*;
  2. Ajoutez la classe ActivityWorker au fichier et fournissez-lui un membre de données pour stocker un client SWF que nous utiliserons pour interagir avec Amazon SWF :

    private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
  3. Ajoutez la méthode que nous utiliserons comme activité :

    private static String sayHello(String input) throws Throwable { return "Hello, " + input + "!"; }

    L'activité prend simplement une chaîne, la combine en une salutation et renvoie le résultat. Même si les risques que cette activité lève une exception sont minimes, il est judicieux de concevoir des activités qui peuvent générer une erreur en cas de problème.

  4. Ajoutez une méthode main que nous utiliserons comme méthode d'interrogation des tâches d'activité. Nous démarrons cette méthode en ajoutant du code pour rechercher des tâches d'activité dans la liste des tâches :

    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'activité reçoit des tâches Amazon SWF en appelant la pollForActivityTask méthode du client SWF, en spécifiant le domaine et la liste de tâches à utiliser dans le fichier transmis PollForActivityTaskRequest.

    Une fois qu'une tâche est reçue, nous récupérons un identificateur unique pour celle-ci en appelant la méthode getTaskToken de la tâche.

  5. Ensuite, écrivez du code pour traiter les tâches qui arrivent. Ajoutez ce qui suit à votre méthode main juste après le code qui recherche la tâche et récupère son jeton.

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

    Si le jeton de la tâche n'est pas null, nous pouvons commencer à exécuter la méthode d'activité (sayHello) en lui fournissant les données d'entrée qui ont été envoyées avec la tâche.

    Si la tâche aboutit (aucune erreur n'a été générée), le travailleur répond au SWF en appelant la respondActivityTaskCompleted méthode du client SWF avec un RespondActivityTaskCompletedRequestobjet contenant le jeton de tâche et les données de résultat de l'activité.

    En revanche, si la tâche échoue, nous répondons en appelant la respondActivityTaskFailed méthode avec un RespondActivityTaskFailedRequestobjet, en lui transmettant le jeton de tâche et des informations sur l'erreur.

Note

Cette activité ne s'arrêtera pas correctement si elle est supprimée. Même si cela dépasse le cadre de ce didacticiel, une autre implémentation de ce travail d'activité est fournie dans la rubrique connexe Arrêt normal des travaux d'activité et de flux de travail.

Implémentation du travail de flux de travail

La logique de flux de travail est située dans un élément de code appelé travail de flux de travail. Le travail de flux de travail recherche les tâches de décision envoyées par Amazon SWF dans le domaine et dans la liste de tâches par défaut avec lesquels le type de flux de travail a été enregistré.

Lorsque le travail de flux de travail reçoit une tâche, il prend une décision (il s'agit généralement de décider s'il faut ou non planifier une nouvelle activité) et exécute une action appropriée (par exemple, planifier l'activité).

  1. Ouvrez votre éditeur de texte et créez le fichier WorkflowWorker.java, en ajoutant une déclaration de package et des déclarations d'importation conformément aux étapes courantes.

  2. Ajoutez quelques déclarations d'importation supplémentaires au fichier :

    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. Déclarez la WorkflowWorker classe et créez une instance de la AmazonSimpleWorkflowClientclasse utilisée pour accéder aux méthodes SWF.

    private static final AmazonSimpleWorkflow swf = AmazonSimpleWorkflowClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
  4. Ajoutez la méthode main. Cette méthode exécute une boucle continue en recherchant les tâches de décision à l'aide de la méthode pollForDecisionTask du client SWF. Le PollForDecisionTaskRequestfournit les détails.

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

    Une fois qu'une tâche est reçue, nous appelons sa méthode getTaskToken qui renvoie une chaîne permettant d'identifier la tâche. Si le jeton renvoyé ne l'est pasnull, nous le traitons plus avant dans la executeDecisionTask méthode, en lui transmettant le jeton de tâche et la liste des HistoryEventobjets envoyés avec la tâche.

  5. Ajoutez la méthode executeDecisionTask, en prenant le jeton de la tâche (un élément String) et la liste HistoryEvent.

    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;

    Nous configurons également des membres de données pour suivre des éléments comme :

    • Une liste d'objets Decision utilisés pour signaler les résultats du traitement de la tâche.

    • Une chaîne contenant l'entrée du flux de travail fournie par l'événement WorkflowExecutionStarted « »

    • Un comptage des activités planifiées et ouvertes (en cours d'exécution) pour éviter de planifier la même activité lorsque celle-ci a déjà été planifiée ou est en cours d'exécution.

    • Une valeur booléenne pour indiquer que l'activité est terminée.

    • Une chaîne pour stocker les résultats de l'activité, qui sera renvoyée en tant que résultat de notre flux de travail.

  6. Ajoutez ensuite du code à executeDecisionTask pour traiter les objets HistoryEvent qui ont été envoyés avec la tâche, en fonction du type d'événement signalé par la méthode getEventType.

    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("]");

    Dans le cadre de notre flux de travail, voici les éléments qui présentent le plus d'intérêt pour nous :

    • l'événement « WorkflowExecutionStarted », qui indique que l'exécution du flux de travail a commencé (ce qui signifie généralement que vous devez exécuter la première activité du flux de travail) et qui fournit l'entrée initiale fournie au flux de travail. Dans ce cas, il s'agit de la partie nom de notre salutation. Cet événement est donc enregistré dans une chaîne à utiliser lors de la planification de l'activité à exécuter.

    • l'événement « ActivityTaskCompleted », qui est envoyé une fois que l'activité planifiée est terminée. Les données d'événement comprennent également la valeur de retour de l'activité terminée. Comme nous n'avons qu'une seule activité, nous utiliserons cette valeur comme résultat de la totalité du flux de travail.

    Les autres types d'événement peuvent être utilisés s'ils sont nécessaires pour votre flux de travail. Consultez la description du HistoryEventcours pour plus d'informations sur chaque type d'événement.

    + REMARQUE : Les chaînes dans switch les instructions ont été introduites dans Java 7. Si vous utilisez une version antérieure de Java, vous pouvez utiliser la EventTypeclasse pour convertir la valeur String renvoyée par en une valeur history_event.getType() d'énumération, puis de nouveau en une String si nécessaire :

EventType et = EventType.fromValue(event.getEventType());
  1. Après l'instruction switch, ajoutez du code pour répondre avec une décision appropriée en fonction de la tâche qui a été reçue.

    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);
    • Si l'activité n'a pas encore été planifiée, nous répondons par une ScheduleActivityTask décision, qui fournit des informations sous forme de ScheduleActivityTaskDecisionAttributesstructure sur l'activité à planifier ensuite, y compris toutes les données qui Amazon SWF doivent être envoyées à l'activité. Amazon SWF

    • Si l'activité est terminée, nous considérons que l'ensemble du flux de travail est terminé et nous répondons par une CompletedWorkflowExecution décision, en remplissant une CompleteWorkflowExecutionDecisionAttributesstructure fournissant des détails sur le flux de travail terminé. Dans ce cas, nous renvoyons le résultat de l'activité.

    Dans les deux cas, les informations de décision sont ajoutées à la liste Decision qui a été déclarée en haut de la méthode.

  2. Terminez la tâche de décision en renvoyant la liste des objets Decision collectés pendant le traitement de la tâche. Ajoutez ce code à la fin de la méthode executeDecisionTask que nous avons écrite :

    swf.respondDecisionTaskCompleted( new RespondDecisionTaskCompletedRequest() .withTaskToken(taskToken) .withDecisions(decisions));

    La méthode respondDecisionTaskCompleted du client SWF prend le jeton de tâche qui identifie la tâche, ainsi que la liste d'objets Decision.

Implémentation du démarreur de flux de travail

Pour finir, nous allons écrire du code pour démarrer l'exécution du flux de travail.

  1. Ouvrez votre éditeur de texte et créez le fichier WorkflowStarter.java, en ajoutant une déclaration de package et des déclarations d'importation conformément aux étapes courantes.

  2. Ajoutez la classe WorkflowStarter :

    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 classe WorkflowStarter est constituée d'une seule méthode, main, qui prend un argument facultatif transmis dans la ligne de commande en tant que données d'entrée pour le flux de travail.

    La méthode client SWFstartWorkflowExecution, prend un StartWorkflowExecutionRequestobjet en entrée. Ici, en plus de spécifier le domaine et le type de flux de travail à exécuter, nous lui fournissons :

    • un nom d'exécution de flux de travail lisible par l'utilisateur ;

    • des données d'entrée de flux de travail (fournies dans la ligne de commande dans notre exemple) ;

    • une valeur de délai d'expiration qui représente la durée, en secondes, que l'exécution de la totalité du flux de travail doit respecter.

    L'objet Run renvoyé par startWorkflowExecution fournit un ID d'exécution, c'est-à-dire une valeur qui peut être utilisée pour identifier cette exécution de flux de travail particulière dans l'historique Amazon SWF de vos exécutions de flux de travail.

    + REMARQUE : L'ID d'exécution est généré par Amazon SWF le nom d'exécution du flux de travail que vous transmettez au démarrage de l'exécution du flux de travail et n'est pas le même que celui-ci.

Génération de l'exemple

Pour générer l'exemple de projet avec Maven, accédez au répertoire helloswf et tapez :

mvn package

Le fichier helloswf-1.0.jar résultant est généré dans le répertoire target.

Exécution de l'exemple

L'exemple est constitué de quatre classes exécutables distinctes qui sont exécutées indépendamment les unes des autres.

Note

Si vous utilisez un système Linux, macOS ou Unix, vous pouvez tous les exécuter, l'un après l'autre, dans une seule fenêtre de terminal. Si vous exécutez Windows, vous devez ouvrir deux instances de ligne de commande supplémentaires et accéder au répertoire helloswf dans chacune d'entre elles.

Définition du chemin de classe Java

Bien que Maven ait géré les dépendances pour vous, pour exécuter l'exemple, vous devez fournir la bibliothèque du AWS SDK et ses dépendances sur votre chemin de classe Java. Vous pouvez définir la variable d'CLASSPATHenvironnement en fonction de l'emplacement des bibliothèques de votre AWS SDK et du third-party/lib répertoire du SDK, qui inclut les dépendances nécessaires :

export CLASSPATH='target/helloswf-1.0.jar:/path/to/sdk/lib/*:/path/to/sdk/third-party/lib/*' java example.swf.hello.HelloTypes

ou utilisez l'-cpoption de la java commande pour définir le chemin de classe lors de l'exécution de chaque application.

java -cp target/helloswf-1.0.jar:/path/to/sdk/lib/*:/path/to/sdk/third-party/lib/* \ example.swf.hello.HelloTypes

C'est à vous de décider ce que vous souhaitez utiliser. Si vous n'avez eu aucun problème à créer le code, essayez d'exécuter les exemples et obtenez une série d'erreurs « NoClassDefFound ». Cela est probablement dû au fait que le chemin de classe n'est pas correctement défini.

Enregistrement du domaine, et des types de flux de travail et d'activité

Avant d'exécuter vos travaux et le démarreur de flux de travail, vous devez enregistrer le domaine, ainsi que vos types de flux de travail et d'activité. Le code pour ce faire a été implémenté dans le flux de travail et les types d'activité Enregistrer un domaine.

Après la génération, et si vous avez défini CLASSPATH, vous pouvez exécuter le code d'enregistrement en lançant la commande :

echo 'Supply the name of one of the example classes as an argument.'

Démarrage des travaux d'activité et de flux de travail

Maintenant que les types ont été enregistrés, vous pouvez démarrer les travaux d'activité et de flux de travail. Ils continueront à s'exécuter et à rechercher des tâches jusqu'à ce qu'ils soient supprimés. Vous devez donc les exécuter dans des fenêtres de terminal distinctes ou, si vous utilisez Linux, macOS ou Unix, vous pouvez utiliser l'&opérateur pour que chacun d'entre eux génère un processus distinct lors de son exécution.

echo 'If there are arguments to the class, put them in quotes after the class name.' exit 1

Si vous exécutez ces commandes dans des fenêtres distinctes, omettez l'opérateur & final dans chaque ligne.

Démarrage de l'exécution de flux de travail

Maintenant que vos travaux d'activité et de flux de travail exécutent l'interrogation, vous pouvez démarrer l'exécution du flux de travail. Ce processus s'exécute jusqu'à ce que le flux de travail renvoie un état terminé. Vous devez l'exécuter dans une nouvelle fenêtre de terminal (sauf si vous avez exécuté vos travaux en tant que nouveaux processus générés à l'aide de l'opérateur &).

fi
Note

Si vous souhaitez fournir vos propres données d'entrée, qui seront transmises d'abord au flux de travail, puis à l'activité, ajoutez-les à la ligne de commande. Par exemple :

echo "## Running $className..."

Une fois que vous avez démarré l'exécution du flux de travail, vous devez commencer à voir la sortie fournie par les deux travaux et par l'exécution de flux de travail proprement dite. Lorsque le flux de travail est terminé, sa sortie est affichée à l'écran.

Exécution de la source pour cet exemple

Vous pouvez parcourir la source complète de cet exemple sur Github dans le aws-java-developer-guideréférentiel.

Pour plus d'informations