

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

# 使用 Amazon SWF 實作獨佔選擇
<a name="swf-dg-exclusive-choice"></a>

在某些情況下，您可能想要根據先前活動的結果來排定一組不同的活動。透過獨家選擇模式，您可以建立符合應用程式複雜需求的彈性工作流程。

Amazon SWF 沒有特定的獨佔選擇動作。若要實作獨佔選擇，您必須撰寫決策者邏輯，以根據先前活動的結果做出決策。互斥選項的一些應用如下：
+ 如果先前活動的結果未成功，則執行清理活動
+ 根據客戶購買基本還是進階方案來排定不同的活動
+ 根據客戶的訂購歷史記錄來執行不同的客戶身分驗證活動

在電子商務範例中，您可以根據收取信用卡費用的結果，使用互斥選項來送出或取消訂單。在下圖中，如果成功收取信用卡費用，則決策者將排定「送出訂單」和「記錄完成」活動任務。否則，決策者將排定「取消訂單」和「發送電子郵件給客戶」活動任務。

![客戶訂單工作流程圖表](http://docs.aws.amazon.com/zh_tw/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
```