Tutorial de fluxo de trabalho de inscrição - Parte 4: Implementar o agente de sondagem de tarefas de atividades - Amazon Simple Workflow Service

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

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 nas activity_tasks 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 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! ou falha! na tarefa com base no código de retorno.

nota

Esse código sai do agente de sondagem após a inicialização da atividade final, uma vez que já concluiu sua missão e iniciou 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.

Este é o final do código para a nossa aula sobre ActivitiesPoller, mas adicionaremos um pouco mais de código no fim 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.