

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Implementando opções exclusivas com o Amazon SWF
<a name="swf-dg-exclusive-choice"></a>

Em alguns cenários, convém agendar um conjunto diferente de atividades com base no resultado de uma atividade anterior. Com o padrão de escolha exclusivo, você pode criar fluxos de trabalho flexíveis que atendam aos requisitos complexos do seu aplicativo.

O Amazon SWF não tem uma ação de escolha exclusiva específica. Para implementar a escolha exclusiva, você deve escrever sua lógica decisória para tomar decisões com base nos resultados de uma atividade anterior. Alguns aplicações para escolha exclusiva incluem:
+ Realizar atividades de limpeza quando os resultados de uma atividade anterior não tiveram êxito
+ Agendar atividades diferentes com base em se o cliente adquiriu um plano básico ou avançado
+ Realizar diferentes atividades de autenticação de cliente com base no histórico de pedidos de um cliente

No exemplo de comércio eletrônico, você pode usar a escolha exclusiva para enviar ou cancelar um pedido com base no resultado da cobrança do cartão de crédito. Na figura a seguir, o agente de decisão agenda as tarefas de atividade Enviar o pedido e Registrar a conclusão quando o cartão de crédito é debitado com êxito. Caso contrário, ele agenda as tarefas de atividade Cancelar o pedido e Enviar e-mail para o cliente.

![\[Diagrama do fluxo de trabalho de pedido de cliente\]](http://docs.aws.amazon.com/pt_br/amazonswf/latest/developerguide/images/swf-dg-customer-order-workflow.png)


O agente de decisão agenda a atividade `ShipOrder` quando o cartão de crédito é debitado com êxito. Caso contrário, ele agenda a atividade `CancelOrder`.

Nesse caso, programe o agente de decisão para interpretar o histórico e determinar se o cartão de crédito foi cobrado com êxito. Para fazer isso, você pode ter uma lógica semelhante à seguinte

```
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
```

Se o cartão de crédito tiver sido debitado com êxito, o agente de decisão deverá responder com `RespondDecisionTaskCompleted` para agendar a atividade `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"
          }
      }
  ]
}
```

Se o cartão de crédito não tiver sido debitado com êxito, o agente de decisão deverá responder com `RespondDecisionTaskCompleted` para agendar a atividade `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"
          }
      }
  ]
}
```

Se o Amazon SWF for capaz de validar os dados na ação `RespondDecisionTaskCompleted`, o Amazon SWF retornará uma resposta HTTP bem-sucedida semelhante à seguinte.

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