Amazon Simple Workflow Service を使用した排他的な選択の実装 - Amazon Simple Workflow Service

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

Amazon Simple Workflow Service を使用した排他的な選択の実装

一部のシナリオでは、前のアクティビティの結果に基づいて、異なるアクティビティのセットをスケジュールする場合があります。排他的な選択パターンにより、アプリケーションの複雑な条件を満たす柔軟性の高いワークフローを作成することができます。

Amazon Simple Workflow Service (Amazon SWF) には、特定の排他的な選択アクションはありません。排他的な選択を使用するには、前のアクティビティの結果に基づいて異なる決定を行うためのディサイダーロジックに記述するだけです。排他的な選択のアプリケーションには、以下のような例があります。

  • 前のアクティビティの結果が失敗の場合にクリーンアップアクティビティを実行する

  • 顧客が基本プランを購入したかアドバンストプランを購入したかに基づいて、異なるアクティビティをスケジュールする

  • 顧客の注文履歴に基づいて異なる顧客認証アクティビティを実行する

e コマースの例では、クレジットカードの課金結果に基づいて注文品を発送するかキャンセルする排他的な選択を使用できます。次の図では、クレジットカードに正しく課金された場合に、ディサイダーが [注文品の発送と完了の記録] アクティビティタスクをスケジュールします。それ以外の場合、[注文のキャンセルおよび顧客への E メール送信] アクティビティタスクをスケジュールします。


          顧客の注文ワークフローの図

クレジットカードに正常に課金された場合、ディサイダーは ShipOrder アクティビティをスケジュールします。それ以外の場合、ディサイダーは CancelOrder アクティビティをスケジュールします。

この場合、履歴を解釈し、クレジットカードが正常に課金されたかどうかを確認するようにディサイダーをプログラムします。これを行うため、次のようなロジックがあるとします。

IF lastEvent = "WorkflowExecutionStarted" addToDecisions ScheduleActivityTask(ActivityType = "VerifyOrderActivity") ELSIF lastEvent = "ActivityTaskCompleted" AND ActivityType = "VerifyOrderActivity" addToDecisions ScheduleActivityTask(ActivityType = "ChargeCreditCardActivity") #Successful Credit Card Charge Activities ELSIF lastEvent = "ActivityTaskCompleted" AND ActivityType = "ChargeCreditCardActivity" addToDecisions ScheduleActivityTask(ActivityType = "ShipOrderActivity") ELSIF lastEvent = "ActivityTaskCompleted" AND ActivityType = "ShipOrderActivity" addToDecisions ScheduleActivityTask(ActivityType = "RecordOrderCompletionActivity") ELSIF lastEvent = "ActivityTaskCompleted" AND ActivityType = "RecordOrderCompletionActivity" addToDecisions CompleteWorkflowExecution #Unsuccessful Credit Card Charge Activities ELSIF lastEvent = "ActivityTaskFailed" AND ActivityType = "ChargeCreditCardActivity" addToDecisions ScheduleActivityTask(ActivityType = "CancelOrderActivity") ELSIF lastEvent = "ActivityTaskCompleted" AND ActivityType = "CancelOrderActivity" addToDecisions ScheduleActivityTask(ActivityType = "EmailCustomerActivity") ELSIF lastEvent = "ActivityTaskCompleted" AND ActivityType = "EmailCustomerActivity" addToDecisions CompleteWorkflowExecution ENDIF

クレジットカードに正常に課金された場合、ディサイダーは RespondDecisionTaskCompleted で応答して ShipOrder アクティビティをスケジュールします。

https://swf.us-east-1.amazonaws.com RespondDecisionTaskCompleted { "taskToken": "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "decisions":[ { "decisionType":"ScheduleActivityTask", "scheduleActivityTaskDecisionAttributes":{ "control":"OPTIONAL_DATA_FOR_DECIDER", "activityType":{ "name":"ShipOrder", "version":"2.4" }, "activityId":"3e2e6e55-e7c4-fee-deed-aa815722b7be", "scheduleToCloseTimeout":"3600", "taskList":{ "name":"SHIPPING" }, "scheduleToStartTimeout":"600", "startToCloseTimeout":"3600", "heartbeatTimeout":"300", "input": "123 Main Street, Anytown, United States" } } ] }

クレジットカードに正常に課金されなかった場合、ディサイダーは RespondDecisionTaskCompleted で応答して CancelOrder アクティビティをスケジュールします。

https://swf.us-east-1.amazonaws.com RespondDecisionTaskCompleted { "taskToken": "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "decisions":[ { "decisionType":"ScheduleActivityTask", "scheduleActivityTaskDecisionAttributes":{ "control":"OPTIONAL_DATA_FOR_DECIDER", "activityType":{ "name":"CancelOrder", "version":"2.4" }, "activityId":"3e2e6e55-e7c4-fee-deed-aa815722b7be", "scheduleToCloseTimeout":"3600", "taskList":{ "name":"CANCELLATIONS" }, "scheduleToStartTimeout":"600", "startToCloseTimeout":"3600", "heartbeatTimeout":"300", "input": "Out of Stock" } } ] }

Amazon SWF が RespondDecisionTaskCompleted アクションのデータを検証できる場合、Amazon SWF は次のような正常な HTTP レスポンスを返します。

HTTP/1.1 200 OK Content-Length: 11 Content-Type: application/json x-amzn-RequestId: 93cec6f7-0747-11e1-b533-79b402604df1