Le workflow se bloque lorsque l’évènement OnWorkflowItemChanged est présent

English version.

L’évènement OnWorkflowItemChanged se déclenche lorsque l’item qui a initié le workflow a été modifié.

Le problème

L’évènement OnWorkflowItemChanged verrouille le workflow dans la base de données de contenu dès que l’item est modifié, même si cet évènement ne doit pas se déclencher.

Considérons le workflow suivant :

Ce workflow, très simple, crée une tâche, se réveille lorsqu’elle est modifiée par un utilisateur, la supprime et se termine.

Notez que l’évènement OnWorkflowItemChanged est dans une branche conditionnelle qui n’est JAMAIS vraie (la condition est ‘1 == 2’), donc il ne devrait jamais interférer dans l’exécution du workflow.

Considérons le scénario suivant :

1) Vous créez un item sur lequel vous démarrez le workflow.

2) Une fois que le workflow est démarré, vous éditez l’item.

3) Vous éditez la tâche (ce qui devrait normalement réveiller immédiatement le workflow pour qu’il se termine).

Cependant, à cause de l’évènement OnWorkflowItemChanged, l’instance de ce workflow s’est bloquée en base dés que l’item a été modifié (dans l’étape 2).

En conséquence, vous devez attendre un certain temps (incompressible) avant que l’OWSTIMER ne réveille l’instance et reprenne son exécution.

De plus, un effet de bord que vous pourrez constater est ce message si vous remodifiez la tâche:
“This task is currently locked by a running workflow and cannot be edited.”

 

Comment le résoudre

1) Si vous attendez suffisamment longtemps, l’exécution workfolow devrait toujours finir par reprendre dans l’OWSTIMER.

2) Vous pouvez modifier le design du workflow pour contourner le problème:

Voilà le même workflow avec quelques modifications. J’ai également supprimé la condition car elle n’était utile que pour illustrer le problème:

WorkflowOK

Les modifications suivantes permettent de faire fonctionner l’évènement sans bloquer le workflow :

  1. Ajoutez une SequenceActivity et déplacez l’évènement OnWorkflowItemChanged à l’intérieur.
  2. Ajoutez une activité InitializeWorkflow en premier dans la SequenceActivity.
  3. Créez un nouveau jeton de corrélation dans l’activité InitializeWorkflow et mettez le champ OwnerActivityName à la SequenceActivity.
  4. Utilisez ce nouveau jeton de corrélation dans l’évènement OnWorkflowItemChanged.

Ces modifications vous permettront d’utiliser l’évènement OnWorkflowItemChanged dans votre workflow sans qu’il perturbe celui-ci.

Yvan Duhamel, Support Escalation Engineer