Persistance&Tracking avec Workflow Foundation
Windows Workflow Foundation propose deux services fort utile qui sont le Tracking et la Persistance.
La persistance va permettre d’enregistrer l’instance d’un workflow en dur dans un serveur SQL. On va pouvoir grace a cela, demarrer une instance de workflow depuis une application host, la quitter, puis la reprendre a tout moment. La persistance devient alors très utile, imaginez un workflow de gestion d’article qui demarre au moment où un article serait posté et attendrait la validation des admins pour etre publié. Il serait alors fort utile de pouvoir enregistrer et reprendre le workflow quand on le souhaite pour que les admins puissent donner leur reponse à tout moment.
La persistance sous WF est très simple a mettre en oeuvre :
Il faut d’abord préparer la base de données en executant les scripts SQL qui se trouvent dans C:\WINDOWS\WinFX\v3.0\Windows Workflow Foundation\SQL\EN. Il y a 4fichiers : 2 pour les schémas et 2 pour la logique pour la persistance et le tracking. Executez les schémas en 1er biensûr 🙂
Ensuite pour activer la persistance dans votre workflow, ajoutez le service SqlWorkflowPersistenceService à votre runtime. ex:
1 | Dim persistance As New SqlWorkflowPersistenceService(CONNSTRING, True, New TimeSpan(0, 0, 5), New TimeSpan(0, 0, 5) runtime.AddService(persistance) |
A tout moment vous allez pouvoir recuperer les instances persistées par le code :
1 | Dim instances As IEnumerable(Of SqlPersistenceWorkflowInstanceDescription) = persistance.GetAllWorkflows() |
Vous recuperez une collection de SqlPersistenceWorkflowInstanceDescription où vous allez pouvoir recuperer des informations comme son status, son ID d’instance, etc…
Enfin pour récupérer une instance :
1 | Dim instance as WorkflowInstance = runtime.GetWorkflow(_instanceID) |
où _instanceID est un Guid qui correspond à l’ID de l’instance à resumer.
Le Tracking quant à lui, permet de « traquer » un workflow en enregistrant des tas de parametres sur son déroulement. Pour le mettre en place, c’est aussi facile que pour la persistance. Assurez-vous d’avoir bien créé les tables (scripts Tracking_Logic et Tracking_Shema). Ensuite tout comme la persistance, il faudra ajouter le service tracking à la runtime par le code :
1 | Dim tracking As New SqlTrackingService(CONNSTRING) runtime.AddService(tracking) |
Vous pourrez ensuite recuperer un tas de parametres pour toutes les instances par le code :
1 2 | Dim stq As New SqlTrackingQuery(CONNSTRING) Return stq.GetWorkflows(New SqlTrackingQueryOptions()) |
Ce code vous retournera une List(Of SqlTrackingWorkflowInstance) (autopub: explication des List ici) :))
L’objet SqlTrackingQueryOptions permet quant à lui, d’imposer des conditions de recherche. L’exemple ci-dessous permet de recuperer seulement les instances en cours (running) :
1 2 3 4 | Dim stq As New SqlTrackingQuery(CONNSTRING) Dim opt As New SqlTrackingQueryOptions() opt.WorkflowStatus = WorkflowStatus.Running Return stq.GetWorkflows(opt) |
L’objet SqlTrackingWorkflowInstance contient toutes les informations sur une instance de Workflow. On y trouve les propriètés ActivityEvents (evenement des Activity), Status, UserEvents (evenement des utilisateurs comme par exemple les traces laissées par les TrackData dans le workflow), WorkflowInstanceId, etc…
Toutes les specs du SqlTrackingWorkflowInstance : http://windowssdk.msdn.microsoft.com/en-us/lib…
Conclusion : ca devient un vrai jeu d’enfant, sous WF, de persister et tracer un workflow. Moi j’adore 🙂