Gestion de la persistance des workflows : réhydratation

Résolu
oo7jb5 Messages postés 45 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 3 mars 2010 - 12 févr. 2009 à 11:06
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

2 réponses

oo7jb5 Messages postés 45 Date d'inscription jeudi 8 mars 2007 Statut Membre Dernière intervention 3 mars 2010
23 févr. 2009 à 15:09
Problème "réglé" en utilisant le déchargement manuel (UnloadOnIdle = false) ...
3
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,
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
0
Rejoignez-nous