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

oo7jb5 45 Messages postés jeudi 8 mars 2007Date d'inscription 3 mars 2010 Dernière intervention - 12 févr. 2009 à 11:06 - Dernière réponse : samsoumitta 23 Messages postés mardi 21 avril 2009Date d'inscription 9 juin 2010 Dernière intervention
- 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 

Votre réponse

2 réponses

oo7jb5 45 Messages postés jeudi 8 mars 2007Date d'inscription 3 mars 2010 Dernière intervention - 23 févr. 2009 à 15:09
+3
Utile
Problème "réglé" en utilisant le déchargement manuel (UnloadOnIdle = false) ...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de oo7jb5
samsoumitta 23 Messages postés mardi 21 avril 2009Date d'inscription 9 juin 2010 Dernière intervention - 18 mai 2010 à 00:36
0
Utile
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.