子工作流程执行 - AWS Flow Framework 适用于 Java

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

子工作流程执行

在以前的示例中,我们直接从应用程序中启动工作流程执行。不过,可以在生成的客户端上调用工作流程入口点方法,以从工作流程中启动工作流程执行。在从其他工作流程执行的上下文中启动工作流程执行时,它称为子工作流程执行。这样,您就可以将复杂工作流程重构为较小的单元,并且可能会在不同的工作流程之间共享这些单元。例如,您可以创建一个支付处理工作流程,并从订单处理工作流程中调用该工作流程。

从语义上讲,子工作流程执行的行为与单独工作流程相同,但存在以下差异:

  1. 如果父工作流因用户执行的显式操作而终止(例如,因调用 TerminateWorkflowExecution Amazon 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); }