Quatrième partie du didacticiel sur le flux de Mise en œuvre de l'animateur de tâches d'activité - Amazon Simple Workflow Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Quatrième partie du didacticiel sur le flux de Mise en œuvre de l'animateur de tâches d'activité

Dans Amazon SWF, les tâches d'activité d'une exécution de flux de travail en cours s'affichent sur leliste des tâches d'activité, fourni lorsque vous planifiez une activité dans le flux de travail.

Nous allons mettre en œuvre un analyseur d'activité de base pour gérer ces tâches pour notre flux de travail et l'utiliser pour lancer nos activités quand Amazon SWF insère une tâche dans la liste des tâches d'activité afin de démarrer l'activité.

Pour commencer, créez un fichier nommé swf_sns_activities.rb. Nous allons l'utiliser pour effectuer les actions suivantes :

  • Instancier les classes d'activité que nous avons créées

  • Enregistrer chaque activité via Amazon SWF.

  • Rechercher les activités et appeler do_activity pour chacune d'elles lorsque son nom apparaît dans la liste des tâches d'activité

Dans le fichier swf_sns_activities.rb, ajoutez les instructions suivantes afin de demander chacune des classes d'activité que nous avons définies.

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'

Nous allons maintenant créer la classe et fournir un code d'initialisation.

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

En plus d'enregistrer le domaine et la liste de tâches, ce code instancie chacune des classes d'activité que nous avons créées. Parce que chaque classe enregistre son activité associée (voirbasic_activity.rbsi vous devez vérifier ce code), cela suffit pour informer Amazon SWF de toutes les activités que nous allons exécuter.

Nous stockons chaque activité instanciée dans une carte en utilisant le nom de l'activité (par exemple, get_contact_activity) comme clé. Cela nous permettra de rechercher les activités facilement dans le code de l'observateur d'activité, que nous allons définir ensuite.

Créez une méthode dénommée poll_for_activities et appelez poll au niveau des tâches d'activité détenues par le domaine afin de les récupérer.

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

Nous pouvons obtenir le nom de l'activité à partir du membre activity_type de la tâche. Ensuite, nous allons utiliser le nom d'activité associé à cette tâche pour rechercher la classe dans laquelle exécuter do_activity, en le transmettant à la tâche (qui inclut toutes les données d'entrée qui doivent être transférées à l'activité).

# 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

Le code seulement attend que do_activity termine, puis appelle soit terminée ! soit échouer ! sur la tâche en fonction du code de retour.

Note

Ce code sort de l'observateur une fois que l'activité finale a été lancée, dans la mesure où l'observateur a rempli sa mission et a lancé toutes les activités. Dans votre propre code Amazon SWF, si vos activités sont susceptibles d'être lancées à nouveau, il peut être utile d'exécuter l'analyseur d'activité indéfiniment.

Nous arrivons à la fin du code de la classe ActivitiesPoller, mais nous allons ajouter un peu de code supplémentaire à la fin du fichier pour permettre à l'utilisateur de l'exécuter à partir de la ligne de commande.

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 l'utilisateur exécute le fichier à partir de la ligne de commande (en lui transmettant une liste de tâches activité comme premier argument), ce code instanciera la classe de l'observateur et lancera la recherche d'activités. Une fois que l'observateur a terminé (après avoir lancé l'activité finale), il nous suffit d'imprimer un message et de sortir.

Voilà ce qui marque la fin de l'observateur d'activité. Il ne vous reste plus qu'à exécuter le code et à voir comment il fonctionne, comme décrit dans la section Didacticiel sur le flux de travail Exécution du flux de travail.