Parte 4 del tutorial acerca del flujo de trabajo de suscripción: implementación del sondeador de tareas de actividades - Amazon Simple Workflow Service

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

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 en la instancia de activity_tasks 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 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! o a fail! de la tarea, en función del código devuelto.

nota

Este código sale del sondeador una vez que se ha lanzado la actividad final, ya que 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.

Ese es el final del código para nuestra clase ActivitiesPoller, pero añadiremos algo más de código al final del archivo para permitir al usuario ejecutarlo en 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.