

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

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

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

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

1. 當父工作流程因使用者明確動作而終止時，例如，透過呼叫 `TerminateWorkflowExecution` Amazon SWF API，或因逾時而終止時，子工作流程執行的命運將由子政策決定。您可以設定此子政策終止、取消或捨棄 (繼續執行) 子工作流程執行。

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

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

}
```