Mostefai Mohammed Amine's Blog

Say That I Was Here !

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 » 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 extensionsapp.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   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 Code Source Le code source est accessible ici.