

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 travail d'abonnement : mise en œuvre de l'observateur de tâches d'activité
<a name="swf-sns-tutorial-implementing-activities-poller"></a>

Dans Amazon SWF, les tâches d'activité relatives à l'exécution d'un flux de travail en cours apparaissent dans la *liste des tâches d'activité*, qui est fournie lorsque vous planifiez une activité dans le flux de travail.

Nous allons implémenter un outil de sondage d'activité de base pour gérer ces tâches dans le cadre de notre flux de travail, et nous l'utiliserons pour lancer nos activités lorsqu'Amazon SWF place une tâche dans la liste des tâches d'activité pour 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
+ Enregistrez chaque activité auprès d'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. Comme chaque classe enregistre son activité associée (référez-vous à ce code `basic_activity.rb` si vous devez consulter 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](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTaskCollection.html#poll-instance_method) au niveau des [tâches d'activité](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/Domain.html#activity_tasks-instance_method) 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](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#activity_type-instance_method) 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 \!](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#complete!-instance_method) soit [échouer \!](https://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SimpleWorkflow/ActivityTask.html#fail!-instance_method) sur la tâche en fonction du code de retour.

**Note**  
Ce code sort du sondeur une fois que l'activité finale a été lancée, car il a terminé sa mission et a lancé toutes les activités. Dans votre propre code Amazon SWF, si vos activités sont susceptibles d'être réexécutées, vous souhaiterez peut-être que le sondeur d'activité fonctionne indéfiniment.

C'est la fin du code de notre **ActivitiesPoller**classe, mais nous allons ajouter un peu plus de code à la fin du fichier pour permettre à l'utilisateur de l'exécuter depuis 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 d'abonnement : exécution du flux de travail](swf-sns-tutorial-running-the-workflow.md).