

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

# Amazon SWF による排他的な選択の実装
<a name="swf-dg-exclusive-choice"></a>

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

Amazon SWF には、特定の排他的な選択アクションはありません。排他的な選択を実装するには、ディサイダーロジックを記述して、以前のアクティビティの結果に基づいて決定を行う必要があります。排他的な選択のアプリケーションには、以下のような例があります。
+ 前のアクティビティの結果が失敗の場合にクリーンアップアクティビティを実行する
+ 顧客が基本プランを購入したかアドバンストプランを購入したかに基づいて、異なるアクティビティをスケジュールする
+ 顧客の注文履歴に基づいて異なる顧客認証アクティビティを実行する

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

![\[顧客の注文ワークフローの図\]](http://docs.aws.amazon.com/ja_jp/amazonswf/latest/developerguide/images/swf-dg-customer-order-workflow.png)


クレジットカードに正常に課金された場合、ディサイダーは `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
```