12 févr. 2009, 11:00
|
drjacky
Rejoint: 05-26-2008
Messages : 4
|
gestion de la persistance des workflows : réhydratation
|
|
|
|
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
|
|
|
|
Adresse IP: Connecté
|
|
|
|
|