Gestion de la persistance des workflows : réhydratation [Résolu]

Messages postés
45
Date d'inscription
jeudi 8 mars 2007
Statut
Membre
Dernière intervention
3 mars 2010
- - Dernière réponse : samsoumitta
Messages postés
23
Date d'inscription
mardi 21 avril 2009
Statut
Membre
Dernière intervention
9 juin 2010
- 18 mai 2010 à 00:36
Bonjour à tous,

Je développe actuellement un workflow permettant de gérer le cycle de vie de documents (C#, VS2008).
Ceux-ci peuvent prendre différents statuts (draft, submitted, validated/rejected).

Tout fonctionne correctement, hormis la persistance, et tout particulièrement le processus de "réhydratation".

Je vais droit au but :
- au delà de 2-3 instances de worflows, lorsque je lance l'appli, je reçois l'exception :
**********************************************************************
An unhandled exception of type 'System.Workflow.Runtime.WorkflowOwnershipException' occurred in System.Workflow.Runtime.dll

Additional
information: This workflow is not owned by the WorkflowRuntime. The
WorkflowRuntime's ownership has expired, or another WorkflowRuntime
owns the workflow.
**********************************************************************
effectivement,
dans la table instanceState, il y a plusieurs ownerId. Comment gérer ce
problème d'appartenance, sachant que l'appli devra, à terme, pouvoir
être utilisée depuis plusieurs postes simultanément ?

- assez
fréquemment, les workflows terminés ("completed") ne sont pas supprimés
de la table instanceState, alors que la condition finale est vérifiée
(WhileActivity --> IsValidated==false)
d'autre part, le status de ces mêmes WFs reste à 0 ("running") dans instanceState.

Voici le code utile :

lstWIs = new List<Guid>();

// Persistance management :

// déchargement en cas de pause du WF (UnloadOnIdle), déchargement sur la BD toutes les 30"

SqlWorkflowPersistenceService dbService = new SqlWorkflowPersistenceService(ConfigurationManager.ConnectionStrings["WFStateCS"].ToString(), true, TimeSpan.MaxValue, new TimeSpan(0, 0, 30));

// Création du runtime

wfRuntime = new WorkflowRuntime();
wfRuntime.AddService(dbService);

// Continuation des WFs existants (persistés)

IEnumerable<SqlPersistenceWorkflowInstanceDescription> instances = dbService.GetAllWorkflows();

foreach (SqlPersistenceWorkflowInstanceDescription insDesc in instances)

{
     
    wiPersisted = wfRuntime.GetWorkflow(insDesc.WorkflowInstanceId);

    lstWIs.Add(insDesc.WorkflowInstanceId);

    tmpGuid = Record.RecordDAO.GetInstance().GetRecId(wiPersisted.InstanceId);

    if (tmpGuid != Guid.Empty)

    // Ce workflow est actif (utilisé par un enregistrement) et doit être relancé

    {

        wiPersisted.Load(); // (re)chargement du WF

    }

}

 

Notez
que, malgré le UnloadOnIdle = true, je décharge quand même manuellement
tous les WFs actifs (présents dans la liste "lstWIs") sur l'event
form_closed.

Merci d'éclairer ma lanterne (un petit sample éventuellement serait le bienvenue...) !

Etienne
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
45
Date d'inscription
jeudi 8 mars 2007
Statut
Membre
Dernière intervention
3 mars 2010
3
Merci
Problème "réglé" en utilisant le déchargement manuel (UnloadOnIdle = false) ...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 133 internautes nous ont dit merci ce mois-ci

Commenter la réponse de oo7jb5
Messages postés
23
Date d'inscription
mardi 21 avril 2009
Statut
Membre
Dernière intervention
9 juin 2010
0
Merci
Bonjour,
je suis entrain de développer une application de GED, donc pour gérer le cycle de vie du document je doit développer un workflow mais j'ai rencontrer pas mal de problème car c'est la 1ère application que je développe en ASP.Net C# et je suis très pressée par le temps.
SVP -si ça ne vous dérange pas- m'envoyez le code source du workflow qui permet de gérer le cycle de vie du document à cette adresse : samsoumitta@live.fr
Commenter la réponse de samsoumitta