Workflow Foundation Cours 4–Tutoriel 4.2 Suivi

L’objectif de ce tutoriel est de mettre en place le suivi des workflows. Pour ce, nous utiliserons l’implémentation standard « ETWTrackingParticipant » qui écrit les évènements sur le journal des évènements. Nous ajoutons aussi une implémentation personnalisée qui écrit les évènements sur la console.

Etape 1 – Ouverture de la solution.

L’objectif de dupliquer la solution créée dans le tutoriel 4.1.

  • Accédez au répertoire contenant la solution du tutoriel 4.1
  • Dupliquez le répertoire pour ne pas perdre les résultats du tutoriel précédent.
  • Renommez le nouveau répertoire « Tutoriel42 »
  • Ouvrez la solution dans Visual Studio

Etape 2 : Préparation de l’observateur d’évènements

L’objectif de cette étape est de préparer l’observateur d’évènements de façon à ce qu’il reçoive les enregistrements émis par les trackers.

  • A partir du menu démarrer, lancez l’observateur d’évènements.
  • Dans le menu « Affichage », cliquez sur « Afficher les journaux de débogage et d’analyse »
  • Ouvrez le nœud « Journaux des applications et des services » à « Microsoft » à « Windows » « Application Server-Applications »
  • Remarquez la présence du journal « Analytique »
  • Cliquez avec le bouton droit sur le journal puis cliquez sur « Activer le journal »

image

  • Dans Visual Studio, ouvrez le fichier « MainWindow.xaml.cs »
  • Modifiez la méthode « ConfigurerApplication » de façon à créer un « Tracker » qui suit les états des activités.
  • La création du tracker doit se faire comme ceci :
// créer le tracker
          var tracker = new EtwTrackingParticipant()
          {
              TrackingProfile = new TrackingProfile()
              {
                  Name = "Formation WF",
                  Queries = {
                      new ActivityStateQuery()
                      {
                          States = {"*"}
                      }
                  }
              }
          };
  • Le tracker créé avec un profil appelé « Formation WF » et une requête sur tous les états
  • L’étape suivante doit être d’ajouter le tracker aux extensions
// ajouter le tracker aux extensions
app.Extensions.Add(tracker);
  • Le listing complet de la méthode « ConfigurerApplication » doit être comme ceci :
/// <summary>
      /// configure l'application
      /// </summary>
      /// <param name="app"></param>
      /// <param name="NomCandidat"></param>
      private void ConfigurerApplication(WorkflowApplication app, string NomCandidat = null)
      {
          // affecter le store
          app.InstanceStore = _store;
          // ajouter l'extension pour pouvoir persister le dossier du candidat
          app.Extensions.Add(new CandidatParticipant() { Nom = NomCandidat });
          // créer le tracker
          var tracker = new EtwTrackingParticipant()
          {
              TrackingProfile = new TrackingProfile()
              {
                  Name = "Formation WF",
                  Queries = {
                      new ActivityStateQuery()
                      {
                          States = {"*"}
                      }
                  }
              }
          };
 
          // ajouter le tracker aux extensions
          app.Extensions.Add(tracker);
        
          // évènement à déclencher lorsque le workflow est en mode veille
          app.Idle = delegate(WorkflowApplicationIdleEventArgs args)
          {
              var signet = args.Bookmarks.FirstOrDefault();
              if (signet == null)
                  return;
              DesactiverBoutons();
              switch (signet.BookmarkName)
              {
                  case "EvaluationTechnique":
                      ActiverBouton(btnTechnique, true);
                      break;
                  case "EvaluationOrale":
                      ActiverBouton(btnOral, true);
                      break;
              }
          };
 
          // évènement se déclenchant avant la persistance
          app.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs args)
          {
              Console.WriteLine("Workflow {0} va être persisté", args.InstanceId);
              return PersistableIdleAction.Unload;
          };
 
          // affiche un message lorsque le workflow est déchargé
          app.Unloaded += delegate(WorkflowApplicationEventArgs args)
          {
              Console.WriteLine("Workflow {0} déchargé", args.InstanceId);
          };
 
          // se déclenche lorsque le workflow se termine
          app.Completed += delegate(WorkflowApplicationCompletedEventArgs args)
          {
              var extensions = args.GetInstanceExtensions<CandidatParticipant>();
              var dossier = extensions.First();
              Console.WriteLine("Workflow {0} terminé avec statut {1}", args.InstanceId, args.CompletionState);
              Console.WriteLine("L'opération d'embauche du dossier {0} a été terminée avec une moyenne de {1}", dossier.Nom, args.Outputs["moyenne"]);
              DesactiverBoutons();
              // supprimer le workflow de la liste
              cbWorkflows.Dispatcher.Invoke(new Action(() => _liste.Remove(args.InstanceId)));
 
          };
      }
  • Exécutez l’application et créez quelques candidatures
  • Revenez à l’observateur d’évènements et accédez aux évènements émis par le workflow

image

 

Etape 2 : Création d’un tracker personnalisé

L’objectif de cette étape est de créer un tracker personnalisé qui affiche les enregistrements en mode console.

  • Ajoutez un using sur « System.Activities.Tracking »
  • Ajoutez une nouvelle classe publique à la bibliothèque « EmbaucheLibrary » appelée « ConsoleTrackingParticipant » et qui hérite de la classe « TrackingParticipant »
  • Redéfinissez la méthode « Track » de façon à ce qu’elle affiche l’enregistrement sur la console :
if (record != null)
    Console.WriteLine(record);
  • Dans la méthode « ConfigurerApplication », changez le type de la variable « tracker » de « EtwTrackingParticipant » vers « ConsoleTrackingParticipant »
  • Le listing complet de la classe « ConsoleTrackingParticipant » est comme ceci :
public class ConsoleTrackingParticipant : TrackingParticipant
    {
        protected override void Track(TrackingRecord record, TimeSpan timeout)
        {
            if (record != null)
                Console.WriteLine(record);
        }
    }
  • Exécutez l’application pour voir les enregistrements en mode console

image

Code Source

Le code source est accessible ici.

Add comment

Loading