

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

# 子工作流程执行
<a name="childworkflow"></a>

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

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

1. 如果父工作流因用户执行的显式操作而终止（例如，因调用 `TerminateWorkflowExecution` Amazon SWF API 或因超时而终止），那么子工作流的执行将由子策略决定。您可以设置该子策略以终止、取消或放弃 (保持运行) 子工作流程执行。

1. 就像异步方法返回的 `Promise<T>` 一样，父工作流程执行可以使用子工作流程的输出 (入口点方法的返回值)。这与独立执行不同，在独立执行中，应用程序必须使用 Amazon SW APIs F 获取输出。

在以下示例中，`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);

}
```