Execuções do fluxo de trabalho filho - AWS Flow Framework para Java

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Execuções do fluxo de trabalho filho

Nos exemplos até agora, iniciamos uma execução de fluxo de trabalho diretamente de um aplicativo. Contudo, uma execução de fluxo de trabalho pode ser iniciada de dentro de um fluxo de trabalho chamando o método do ponto de entrada do fluxo de trabalho no cliente gerado. Quando uma execução de fluxo de trabalho é iniciada no contexto de outra execução de fluxo de trabalho, ela é chamada de execução do fluxo de trabalho filho. Isso permite levar em conta novamente fluxos de trabalho complexos em unidades menores e, potencialmente, compartilhá-los em fluxos de trabalho diferentes. Por exemplo, você pode criar um fluxo de trabalho de processamento de pagamento e chamá-lo a partir de um fluxo de trabalho de processamento de pedido.

Semanticamente, a execução do fluxo de trabalho filho se comporta da mesma forma que um fluxo de trabalho autônomo, exceto para as seguintes diferenças:

  1. Quando o fluxo de trabalho pai é encerrado devido a uma ação explícita do usuário - por exemplo, chamando a API TerminateWorkflowExecution Amazon SWF, ou é encerrado devido a um tempo limite -, o destino da execução do fluxo de trabalho filho será determinado por uma política filho. Defina essa política filha para encerrar, cancelar ou abandonar (manter em execução) execuções do fluxo de trabalho filho.

  2. A saída do fluxo de trabalho filho (valor de retorno do método do ponto de entrada) pode ser usada pela execução do fluxo de trabalho pai assim como o Promise<T> retornado por um método assíncrono. Isso é diferente das execuções autônomas em que o aplicativo deve obter a saída usando as APIs do Amazon SWF.

No exemplo a seguir, o fluxo de trabalho OrderProcessor cria um fluxo de trabalho filho 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); }