Esecuzioni del flusso di lavoro figlio - AWS Flow Framework per Java

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

Esecuzioni del flusso di lavoro figlio

Negli esempi riportati finora, abbiamo iniziato l'esecuzione del flusso di lavoro direttamente da un'applicazione. Tuttavia, un'esecuzione del flusso di lavoro può essere avviata dall'interno di un flusso di lavoro chiamando il metodo del punto di ingresso del flusso di lavoro sul client generato. Quando un'esecuzione del flusso di lavoro viene avviata dal contesto di un'altra esecuzione del flusso di lavoro viene chiamata esecuzione del flusso di lavoro figlio. Questa operazione ti permette di eseguire il refactoring dei flussi di lavoro complessi in unità più piccole e condividerle potenzialmente su diversi flussi di lavoro. Ad esempio, puoi creare un flusso di elaborazione dei pagamenti e chiamarlo da un flusso di lavoro di elaborazione di un ordine.

Da un punto di vista semantico, l'esecuzione del flusso di lavoro figlio si comporta analogamente al flusso di lavoro standalone tranne che per le seguenti caratteristiche:

  1. Quando il flusso di lavoro padre termina a causa di un'azione esplicita dell'utente, ad esempio chiamando ilTerminateWorkflowExecutionL'API Amazon SWF o viene terminata a causa di un timeout, quindi il destino dell'esecuzione del flusso di lavoro figlio sarà determinato da una politica per i bambini. Puoi impostare la policy figlio in modo che termini, annulli o abbandoni (mantenere in esecuzione) le esecuzioni del flusso di lavoro figlio.

  2. L'output del flusso di lavoro figlio (valore restituito del metodo del punto di ingresso) può essere utilizzato dall'esecuzione del flusso di lavoro padre come l'oggetto Promise<T> restituito da un metodo asincrono. Ciò differisce dalle esecuzioni standalone dove l'applicazione deve ottenere l'output utilizzando le API Amazon SWF.

Nell'esempio seguente, il flusso di lavoro OrderProcessor crea un flusso di lavoro figlio 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); }