子ワークフロー実行 - AWS Flow Framework for 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); }