Exécutions de flux de travail enfant - 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.

Exécutions de flux de travail enfant

Dans les exemples jusqu'ici, nous avons démarré une exécution de flux de travail directement depuis une application. Cependant, une exécution de flux de travail peut être démarrée depuis un flux de travail en appelant la méthode de point d'entrée du flux de travail sur le client généré. Lorsqu'une exécution de flux de travail est démarrée depuis le contexte de l'exécution d'un autre flux de travail, celle-ci est appelée exécution de flux de travail enfant. Cela vous permet de remanier des flux de travail complexes en unités plus petites et de les partager potentiellement entre différents flux de travail. Par exemple, vous pouvez créer un flux de travail de traitement des paiements et l'appeler à partir d'un flux de travail de traitement des commandes.

Sur le plan sémantique, le flux de travail enfant se comporte comme un flux de travail autonome, à l'exception des différences suivantes :

  1. Lorsque le flux de travail parent se termine en raison d'une action explicite de l'utilisateur, par exemple en appelant leTerminateWorkflowExecutionL'API Amazon SWF, ou en raison d'un délai d'expiration, le comportement de l'exécution de flux de travail enfant est déterminé par une stratégie enfant. Vous pouvez définir cette stratégie enfant pour arrêter, annuler ou abandonner (continuer d'exécuter) les exécutions de flux de travail enfant.

  2. La sortie du flux de travail enfant (valeur de retour de la méthode de point d'entrée) peut être utilisée par l'exécution de flux de travail parent tout comme l'objet Promise<T> renvoyé par une méthode asynchrone. Il s'agit d'une différence par rapport aux exécutions autonomes où l'application doit obtenir la sortie à l'aide d'API Amazon SWF.

Dans l'exemple suivant, le flux de travail OrderProcessor crée un flux de travail enfant PaymentProcessor :

@Workflow @WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 60, defaultTaskStartToCloseTimeoutSeconds = 10) public interface OrderProcessor { @Execute(version = "1.0") void processOrder(Order order); } public class OrderProcessorImpl implements OrderProcessor { PaymentProcessorClientFactory factory = new PaymentProcessorClientFactoryImpl(); @Override public void processOrder(Order order) { float amount = order.getAmount(); CardInfo cardInfo = order.getCardInfo(); PaymentProcessorClient childWorkflowClient = factory.getClient(); childWorkflowClient.processPayment(amount, cardInfo); } } @Workflow @WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 60, defaultTaskStartToCloseTimeoutSeconds = 10) public interface PaymentProcessor { @Execute(version = "1.0") void processPayment(float amount, CardInfo cardInfo); } public class PaymentProcessorImpl implements PaymentProcessor { PaymentActivitiesClient activitiesClient = new PaymentActivitiesClientImpl(); @Override public void processPayment(float amount, CardInfo cardInfo) { Promise<PaymentType> payType = activitiesClient.getPaymentType(cardInfo); switch(payType.get()) { case Visa: activitiesClient.processVisa(amount, cardInfo); break; case Amex: activitiesClient.processAmex(amount, cardInfo); break; default: throw new UnSupportedPaymentTypeException(); } } } @Activities(version = "1.0") @ActivityRegistrationOptions(defaultTaskScheduleToStartTimeoutSeconds = 3600, defaultTaskStartToCloseTimeoutSeconds = 3600) public interface PaymentActivities { PaymentType getPaymentType(CardInfo cardInfo); void processVisa(float amount, CardInfo cardInfo); void processAmex(float amount, CardInfo cardInfo); }