Application HelloWorldWorkflowAsync - AWS Flow Framework pour Java

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.

Application HelloWorldWorkflowAsync

Il est parfois préférable de faire exécuter certaines tâches en local par un flux de travail au lieu d'utiliser une activité. Cependant, les tâches de flux de travail impliquent souvent le traitement des valeurs représentées par des objets Promise<T>. Si vous transmettez un objet Promise<T> à une méthode de flux de travail synchrone, la méthode s'exécute immédiatement mais elle ne peut pas accéder à la valeur de l'objet Promise<T> tant que l'objet n'est pas prêt. Vous pouvez interroger l'objet Promise<T>.isReady jusqu'à ce qu'il renvoie true, mais cela s'avère inefficace et la méthode peut se bloquer pendant longtemps. Une meilleure approche consiste à utiliser une méthode asynchrone.

Une méthode asynchrone est implémentée de façon presque similaire à une méthode standardsouvent en tant que membre de la classe d'implémentation de flux de travailet s'exécute dans le contexte de l'implémentation de flux de travail. Vous la désignez en tant que méthode asynchrone en appliquant une annotation @Asynchronous qui demande à l'infrastructure de la traiter comme une activité.

  • Quand une implémentation de flux de travail appelle une méthode asynchrone, elle renvoie immédiatement un résultat. Les méthodes asynchrones renvoient généralement un objet Promise<T> qui devient prêt quand la méthode se termine.

  • Si vous transmettez à une méthode asynchrone un ou plusieurs objets Promise<T>, cela diffère l'exécution jusqu'à ce que tous les objets d'entrée soient prêts. Une méthode asynchrone peut donc accéder à ses valeurs Promise<T> d'entrée sans risquer une exception.

Note

En raison de la façon dont leAWS Flow Frameworkpour Java exécute le flux de travail, les méthodes asynchrones s'exécutent généralement plusieurs fois. Vous ne devez donc les utiliser que pour des tâches rapides à faible charge. Il est conseillée d'utiliser des activités pour effectuer des tâches de longue durée comme des calculs volumineux. Pour en savoir plus, consultez AWS Flow FrameworkConcepts de base : Exécution distribuée .

Cette rubrique décrit la procédure pas à pas de HelloWorldWorkflowAsync, une version modifiée de HelloWorldWorkflow qui remplace l'une des activités par une méthode asynchrone. Pour implémenter l'application, créez une copie du package helloWorld.HelloWorldWorkflow dans le répertoire de votre projet et nommez celle-ci helloWorld.HelloWorldWorkflowAsync.

Note

Cette rubrique s'appuie sur les concepts et les fichiers présentés dans les rubriques Application HelloWorld et HelloWorldWorkflow Demande. Familiarisez-vous avec les fichiers et les concepts présentés dans ces rubriques avant de continuer.

Les sections suivantes expliquent comment modifier le code HelloWorldWorkflow initial pour utiliser une méthode asynchrone.

Implémentation d'activités HelloWorldWorkflowAsync

HelloWorldWorkflowAsync implémente son interface d'exécuteur d'activités dans GreeterActivities, comme suit :

import com.amazonaws.services.simpleworkflow.flow.annotations.Activities; import com.amazonaws.services.simpleworkflow.flow.annotations.ActivityRegistrationOptions; @Activities(version="2.0") @ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 300, defaultTaskStartToCloseTimeoutSeconds = 10) public interface GreeterActivities { public String getName(); public void say(String what); }

Cette interface est similaire celle utilisée par HelloWorldWorkflow, avec les exceptions suivantes :

  • Elle omet l'activité getGreeting ; cette tâche est maintenant traitée par une méthode asynchrone.

  • Le numéro de version est défini sur 2.0. Une fois que vous avez enregistré une interface des activités avec Amazon SWF, vous ne pouvez pas la modifier, sauf si vous modifiez le numéro de version.

Les implémentations de méthode d'activité restantes sont identiques à celles de HelloWorldWorkflow. Supprimez juste getGreeting de GreeterActivitiesImpl.

Implémentation de flux de travail HelloWorldWorkflowAsync

HelloWorldWorkflowAsync définit l'interface de flux de travail comme suit :

import com.amazonaws.services.simpleworkflow.flow.annotations.Execute; import com.amazonaws.services.simpleworkflow.flow.annotations.Workflow; import com.amazonaws.services.simpleworkflow.flow.annotations.WorkflowRegistrationOptions; @Workflow @WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 3600) public interface GreeterWorkflow { @Execute(version = "2.0") public void greet(); }

L'interface est identique à HelloWorldWorkflow à l'exception d'un nouveau numéro de version. Comme avec les activités, si vous souhaitez modifier un flux de travail enregistré, vous devez changer sa version.

HelloWorldWorkflowAsync implémente le flux de travail comme suit :

import com.amazonaws.services.simpleworkflow.flow.annotations.Asynchronous; import com.amazonaws.services.simpleworkflow.flow.core.Promise; public class GreeterWorkflowImpl implements GreeterWorkflow { private GreeterActivitiesClient operations = new GreeterActivitiesClientImpl(); @Override public void greet() { Promise<String> name = operations.getName(); Promise<String> greeting = getGreeting(name); operations.say(greeting); } @Asynchronous private Promise<String> getGreeting(Promise<String> name) { String returnString = "Hello " + name.get() + "!"; return Promise.asPromise(returnString); } }

HelloWorldWorkflowAsync remplace l'activité getGreeting par une méthode asynchrone getGreeting, mais la méthode greet fonctionne de la même manière :

  1. Elle exécute l'activité getName qui renvoie immédiatement un objet Promise<String>, name, qui représente le nom.

  2. Appelez la méthode asynchrone getGreeting et transmettez-lui l'objet name. getGreeting renvoie immédiatement un objet Promise<String>, greeting, qui représente la salutation.

  3. Elle exécute l'activité say et la transmet à l'objet greeting.

  4. Lorsque getName se termine, name devient prêt et getGreeting utilise sa valeur pour construire la salutation.

  5. Lorsque getGreeting se termine, greeting devient prêt et say affiche la chaîne sur la console.

La différence est que, au lieu d'appeler le client d'activités pour exécuter une activité getGreeting, la salutation appelle la méthode getGreeting asynchrone. le résultat est le même, mais la méthode getGreeting fonctionne quelque peu différemment de l'activité getGreeting.

  • L'exécuteur de flux de travail utilise une sémantique d'appel de fonction standard pour exécuter getGreeting. Cependant, sert d'intermédiaire pour l'exécution asynchrone de Amazon SWF activité.

  • getGreeting s'exécute dans le processus d'implémentation de flux de travail.

  • getGreeting renvoie un objet Promise<String> au lieu d'un objet String. Pour obtenir la valeur de chaîne détenue par Promise, vous appelez sa méthode get(). Cependant, comme l'activité est exécutée en mode asynchrone, sa valeur de retour peut ne pas être prête immédiatement ; get() déclenche une exception jusqu'à ce que la valeur de retour de la méthode asynchrone soit disponible.

    Pour plus d'informations sur la façon dont Promise fonctionne, consultez AWS Flow FrameworkConcepts de base : Échange de données entre les activités et les flux de travail .

getGreeting crée une valeur de retour en transmettant la chaîne de salutation à la méthode Promise.asPromise statique. Cette méthode crée un objet Promise<T> du type approprié, définit la valeur et le met à l'état prêt.

Hôte et démarreur de flux de travail et d'activités HelloWorldWorkflowAsync

HelloWorldWorkflowAsync implémente GreeterWorker en tant que classe hôte pour les implémentations de flux de travail et d'activité. Cette implémentation est identique à l'implémentation HelloWorldWorkflow, à l'exception du nom de taskListToPoll, qui est défini sur « HelloWorldAsyncList ».

import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflow; import com.amazonaws.services.simpleworkflow.AmazonSimpleWorkflowClient; import com.amazonaws.services.simpleworkflow.flow.ActivityWorker; import com.amazonaws.services.simpleworkflow.flow.WorkflowWorker; public class GreeterWorker { public static void main(String[] args) throws Exception { ClientConfiguration config = new ClientConfiguration().withSocketTimeout(70*1000); String swfAccessId = System.getenv("AWS_ACCESS_KEY_ID"); String swfSecretKey = System.getenv("AWS_SECRET_KEY"); AWSCredentials awsCredentials = new BasicAWSCredentials(swfAccessId, swfSecretKey); AmazonSimpleWorkflow service = new AmazonSimpleWorkflowClient(awsCredentials, config); service.setEndpoint("https://swf.us-east-1.amazonaws.com"); String domain = "helloWorldWalkthrough"; String taskListToPoll = "HelloWorldAsyncList"; ActivityWorker aw = new ActivityWorker(service, domain, taskListToPoll); aw.addActivitiesImplementation(new GreeterActivitiesImpl()); aw.start(); WorkflowWorker wfw = new WorkflowWorker(service, domain, taskListToPoll); wfw.addWorkflowImplementationType(GreeterWorkflowImpl.class); wfw.start(); } }

HelloWorldWorkflowAsync implémente le démarreur de flux de travail dans GreeterMain ; cette implémentation est identique à l'implémentation HelloWorldWorkflow.

Pour exécuter le flux de travail, lancez GreeterWorker et GreeterMain, de la même manière qu'avec HelloWorldWorkflow.