

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 子ワークフロー実行
<a name="childworkflow"></a>

これまでの例では、ワークフロー実行をアプリケーションから直接開始しました。しかし、ワークフローの実行は、生成されたクライアント上でワークフローエントリポイントメソッドを呼び出すことによって、ワークフロー内から開始される場合があります。ワークフローの実行が別のワークフロー実行のコンテキストから開始された場合、その実行は、子ワークフロー実行と呼ばれます。これにより、複雑なワークフローをより小さい単位にリファクタリングし、各ワークフロー間で共有できるようになります。たとえば、支払い処理ワークフローを作成し、注文処理ワークフローから呼び出すことができます。

意味的に、子ワークフロー実行は、次の違いを除き、スタンドアロンワークフローと同じように動作します。

1. ユーザーの明示的なアクションにより親ワークフローが終了した場合 (例: `TerminateWorkflowExecution` Amazon SWF API を呼び出す)、またはタイムアウトにより終了した場合、子ワークフロー実行は、子ポリシーによって変わります。子ワークフローの実行を終了、キャンセル、または中止 (実行中の場合) するには、この子ポリシーを設定します。

1. 子ワークフローの出力 (エントリポイントメソッドの戻り値) は、非同期メソッドによって返る `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);

}
```