

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á.

# Tutorial de fluxo de trabalho de inscrição - Parte 4: Implementar o agente de sondagem de tarefas de atividades
<a name="swf-sns-tutorial-implementing-activities-poller"></a>

No Amazon SWF, as tarefas de atividade para uma execução de fluxo de trabalho em andamento aparecem na *lista de tarefas de atividade*, que é fornecida quando você agenda uma atividade no fluxo de trabalho.

Implementaremos um poller de atividade básico para lidar com essas tarefas em nosso fluxo de trabalho e o usaremos para iniciar nossas atividades quando o Amazon SWF colocar uma tarefa na lista de tarefas de atividade para iniciar a atividade.

Para começar, crie um novo arquivo chamado `swf_sns_activities.rb`. Vamos usá-lo para:
+ Instanciar as classes de atividades que criamos.
+ Registre cada atividade no Amazon SWF.
+ Sondar atividades e chamar `do_activity` para cada atividade quando seu nome aparecer na lista de tarefas de atividade.

Em `swf_sns_activities.rb`, adicione as seguintes instruções para exigir cada uma das classes de atividades que definimos.

```
require_relative 'get_contact_activity.rb'
require_relative 'subscribe_topic_activity.rb'
require_relative 'wait_for_confirmation_activity.rb'
require_relative 'send_result_activity.rb'
```

Agora, criaremos a classe e forneceremos um código de inicialização.

```
class ActivitiesPoller

  def initialize(domain, workflowId)
    @domain = domain
    @workflowId = workflowId
    @activities = {}

    # These are the activities we'll run
    activity_list = [
      GetContactActivity,
      SubscribeTopicActivity,
      WaitForConfirmationActivity,
      SendResultActivity ]

    activity_list.each do | activity_class |
      activity_obj = activity_class.new
      puts "** initialized and registered activity: #{activity_obj.name}"
      # add it to the hash
      @activities[activity_obj.name.to_sym] = activity_obj
    end
  end
```

Além de salvar o *domínio* e a *lista de tarefas* transmitidos, esse código instancia cada uma das classes de atividades que criamos. Como cada classe registra sua atividade associada (consulte `basic_activity.rb` se precisar revisar esse código), isso é suficiente para que o Amazon SWF saiba sobre todas as atividades que serão executadas.

Cada atividade instanciada será armazenada em um mapa usando o nome da atividade como chave (por exemplo, `get_contact_activity`), para que possamos pesquisá-la com facilidade no código do agente de sondagem de atividades, que definiremos a seguir.

Crie um novo método chamado `poll_for_activities` e chame [poll](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTaskCollection.html#poll-instance_method) nas [activity\_tasks](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/Domain.html#activity_tasks-instance_method) mantidas pelo domínio para obter tarefas de atividades.

```
  def poll_for_activities
    @domain.activity_tasks.poll(@workflowId) do | task |
      activity_name = task.activity_type.name
```

Podemos obter o nome da atividade do membro [activity\_type](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#activity_type-instance_method) da tarefa. Em seguida, usaremos o nome da atividade associado a essa tarefa para pesquisar a classe na qual executar `do_activity`, transmitindo a ela a tarefa (que inclui quaisquer dados de entrada que devem ser transferidos para a atividade).

```
      # find the task on the activities list, and run it.
      if @activities.key?(activity_name.to_sym)
        activity = @activities[activity_name.to_sym]
        puts "** Starting activity task: #{activity_name}"
        if activity.do_activity(task)
          puts "++ Activity task completed: #{activity_name}"
          task.complete!({ :result => activity.results })
          # if this is the final activity, stop polling.
          if activity_name == 'send_result_activity'
             return true
          end
        else
          puts "-- Activity task failed: #{activity_name}"
          task.fail!(
            { :reason => activity.results[:reason],
              :details => activity.results[:detail] } )
        end
      else
        puts "couldn't find key in @activities list: #{activity_name}"
        puts "contents: #{@activities.keys}"
      end
    end
  end
end
```

O código apenas aguarda a conclusão do `do_activity` e, em seguida, chama [concluído\!](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#complete!-instance_method) ou [falha\!](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#fail!-instance_method) na tarefa com base no código de retorno.

**nota**  
Esse código sai do poller assim que a atividade final é lançada, porque ele completou sua missão e lançou todas as atividades. Em seu próprio código Amazon SWF, se suas atividades puderem ser executadas novamente, talvez você queira manter o poller de atividades em execução indefinidamente.

Esse é o fim do código da nossa **ActivitiesPoller**classe, mas adicionaremos um pouco mais de código no final do arquivo para permitir que o usuário o execute a partir da linha de comando.

```
if __FILE__ == $0
  if ARGV.count < 1
    puts "You must supply a task-list name to use!"
    exit
  end
  poller = ActivitiesPoller.new(init_domain, ARGV[0])
  poller.poll_for_activities
  puts "All done!"
end
```

Se o usuário executar o arquivo a partir da linha de comando (transmitindo a ele uma lista de tarefas de atividade como o primeiro argumento), esse código instanciará a classe poller e iniciará a sondagem em busca de atividades. Após a conclusão do agente de sondagem (depois que ele tiver iniciado a atividade final), simplesmente imprimimos uma mensagem e saímos.

Isso é tudo para o agente de sondagem de atividades. Tudo o que resta a fazer é executar o código e ver como ele funciona, em [Tutorial de fluxo de trabalho de inscrição: Executar o fluxo de trabalho](swf-sns-tutorial-running-the-workflow.md).