子工作流程執行 - AWS Flow Framework 對於爪哇

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

子工作流程執行

我們在目前提出的範例中,已直接從應用程式啟動工作流程執行。但是,工作流程執行可透過在已產生的用戶端上呼叫工作流程進入點方法,從工作流程內啟動。當工作流程執行從另一個工作流程執行內容中啟動時,它稱之為子工作流程執行。這可以讓您將複雜的工作流程重構成較小的單位,並有可能跨不同工作流程共享它們。例如,您可建立處理付款的工作流程,並從處理訂單的工作流程呼叫它。

在語意上,子工作流程執行和獨立工作流程除下列差異外,二者的運作是一樣的:

  1. 當父工作流由於用户的顯式操作而終止時(例如,通過調用TerminateWorkflowExecutionAmazon SWF API,或因為逾時而終止 — 子工作流程執行的命運就由子政策決定。您可以設定此子政策終止、取消或捨棄 (繼續執行) 子工作流程執行。

  2. 子工作流程的輸出 (傳回進入點方法的值) 可由父工作流程執行使用,如同 Promise<T> 由同步方法傳回。這和應用程式必須使用 Amazon SWF API 取得輸出的獨立執行不同。

在下列範例中,OrderProcessor 工作流程會建立 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); }