

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Parte 4 del tutorial acerca del flujo de trabajo de suscripción: implementación del sondeador de tareas de actividades
<a name="swf-sns-tutorial-implementing-activities-poller"></a>

En Amazon SWF, las tareas de actividad de una ejecución de flujo de trabajo en ejecución aparecen en la *lista de tareas de actividad*, que se proporciona al programar una actividad en el flujo de trabajo.

Implementaremos un sondeador de actividades básico para gestionar estas tareas para nuestro flujo de trabajo y lo usaremos para lanzar nuestras actividades cada vez que Amazon SWF coloque una tarea en la lista de tareas de actividad para comenzar la actividad.

Para empezar, cree un nuevo archivo llamado `swf_sns_activities.rb`. Lo usaremos para:
+ Crear instancias de las clases de actividad que creamos.
+ Registrar cada actividad en Amazon SWF.
+ Sondear actividades y llamar a `do_activity` para cada actividad cuando su nombre aparezca en la lista de tareas de actividad.

En `swf_sns_activities.rb`, añada las siguientes instrucciones para exigir cada una de las clases de actividad 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'
```

Ahora, crearemos la clase y proporcionaremos código de inicialización.

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

Además de guardar el *dominio* y la *lista de tareas* transferidos, este código crea instancias de cada una de las clases de actividad que creamos. Dado que cada clase registra su actividad asociada (consulte `basic_activity.rb` si necesita revisar ese código), esto es suficiente para informar a Amazon SWF acerca de todas las actividades que ejecutaremos.

Para cada actividad de la que se crea una instancia, la almacenamos en un mapa usando el nombre de actividad (como `get_contact_activity`) como clave, por lo que podemos consultarlas fácilmente en el código de sondeador de actividades, que definiremos a continuación.

Cree un nuevo método denominado `poll_for_activities` y llame al [sondeo](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTaskCollection.html#poll-instance_method) en la instancia de [activity\_tasks](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/Domain.html#activity_tasks-instance_method) del dominio para obtener tareas de actividad.

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

Podemos obtener el nombre de actividad del miembro [activity\_type](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#activity_type-instance_method) de la tarea. A continuación, usaremos el nombre de actividad asociado a esta tarea para consultar la clase en la que se ejecutará `do_activity`, pasando la tarea (que incluye los datos de entrada que deben transferirse a la actividad).

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

El código se limita a esperar a que `do_activity` se complete y, a continuación, llama a la instancia [complete\!](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#complete!-instance_method) o a [fail\!](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#fail!-instance_method) de la tarea, en función del código devuelto.

**nota**  
Este código sale del encuestador una vez que se ha lanzado la actividad final, porque ha completado su misión y ha lanzado todas las actividades. En su propio código de Amazon SWF, si sus actividades pueden volver a ejecutarse, es posible que desee mantener el sondeador de actividades en ejecución de forma indefinida.

Este es el final del código de nuestra **ActivitiesPoller**clase, pero añadiremos un poco más de código al final del archivo para que el usuario pueda ejecutarlo desde la línea de comandos.

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

Si el usuario ejecuta el archivo en la línea de comandos (pasando una lista de tareas de actividad como primer argumento), este código creará una instancia de la clase de sondeador y la iniciará sondeando actividades. Una vez que se complete el sondeador (tras haberse lanzado la actividad final), basta con imprimir un mensaje y salir.

Eso es todo para el sondeador de actividades. Todo lo que le queda por hacer es ejecutar el código y ver cómo funciona, en [Tutorial acerca del flujo de trabajo de suscripción: ejecución del flujo de trabajo](swf-sns-tutorial-running-the-workflow.md).