Traitement d'événements WorkflowRuntime
Le moteur d'exécution de workflow Windows déclenche plusieurs événements tout au long de la durée de sa vie que votre application hôte peut gérer. Ceux-ci se composent des événements qui notifient votre application lorsque le moteur d'exécution est Started ou Stopped, ainsi que plusieurs événements qui correspondent à la durée de vie de toutes les instances de workflow courantes. La procédure permettant de créer des gestionnaires d'événements pour ces événements suit le même modèle de gestion des événements fourni dans le .NET Framework. Par exemple, le code suivant crée un gestionnaire d'événements pour l'événement Started déclenché par l'exécution du workflow lorsqu'il commence l'exécution.
AddHandler workflowRuntime.Started, AddressOf OnWorkflowStarted
...
Shared Sub OnWorkflowStarted(ByVal sender As Object, ByVal e As WorkflowRuntimeEventArgs)
Console.WriteLine("WorkflowRuntime started")
End Sub
workflowRuntime.Started += delegate(object sender, WorkflowRuntimeEventArgs e)
{
Console.WriteLine("WorkflowRuntime started");
};
Le tableau suivant répertorie les événements qui peuvent être déclenchés par le moteur d'exécution de workflow Windows relatif au moteur d'exécution de workflow lui-même.
Événement | Description |
---|---|
Déclenché lorsqu'un service dérivé de la classe abstraite WorkflowRuntimeService appelle la méthode RaiseServicesExceptionNotHandledEvent, du fait qu'une exception se produit pendant l'exécution du workflow que le service ne peut pas gérer. |
|
Started |
Déclenché lorsque le moteur d'exécution de workflow commence à s'exécuter. |
Stopped |
Déclenché lorsque le moteur d'exécution de workflow s'arrête. |
Le tableau suivant répertorie les événements d'instance de workflow qui peuvent être déclenchés par le moteur d'exécution de workflow.
Événement | Description | ||
---|---|---|---|
Déclenché lorsqu'un workflow est arrêté au milieu du traitement. |
|||
Déclenché lorsqu'un workflow termine le traitement. |
|||
Déclenché lorsqu'un workflow est instancié. |
|||
Déclenché lorsqu'un workflow entre en état d'inactivité. |
|||
Déclenché lorsqu'un workflow est recréé à partir d'un support de stockage. |
|||
Déclenché lorsque l'état actuel du workflow est rendu persistant pour un support de stockage. |
|||
Déclenché lorsqu'un workflow continue de s'exécuter après qu'il ait été arrêté ou déchargé. |
|||
Déclenché lorsqu'un workflow commence à s'exécuter. |
|||
Déclenché lorsqu'un workflow entre en état suspendu. |
|||
Déclenché lorsqu'un workflow est arrêté. |
|||
Déclenché lorsqu'un workflow est déchargé. |
Conditions WorkflowAbort
Plusieurs conditions distinctes peuvent se produire pendant l'exécution d'un workflow susceptibles de déclencher l'événement WorkflowAborted. Par exemple, une application hôte peut intervenir dans le processus en appelant la méthode Abort d'un objet WorkflowInstance. Dans ce cas, la raison est connue et la logique permettant de gérer cela peut être créée facilement dans l'application hôte elle-même.
Toutefois, il peut également arriver que le moteur d'exécution Windows Workflow Foundation abandonne un workflow. Par exemple, cette condition peut avoir pour résultat l'échec du moteur d'exécution à mettre fin à une instance de workflow. Un scénario courant lié à cette condition concerne le SqlWorkflowPersistenceService. Si le moteur d'exécution de workflow doit terminer un workflow et que le SqlWorkflowPersistenceService est actif, le moteur d'exécution essaiera de rendre l'état du workflow persistant. Toutefois, si une SqlException est levée pendant l'opération de persistance, le moteur d'exécution devra abandonner l'instance de workflow. Lorsque cela se produit, vous pouvez utiliser un TrackingService pour vider les informations sur les exceptions pour déboguer le scénario qui a provoqué l'abandon de l'instance du workflow par le moteur d'exécution.
Déterminer la source de l'arrêt du workflow
L'événement WorkflowTerminated peut être déclenché par programme via l'application hôte, en utilisant une TerminateActivity dans un workflow ou à la suite d'une exception non interceptée. Si votre application hôte doit effectuer une certaine logique basée sur le type d'action qui a provoqué l'arrêt du workflow, vous devrez vérifier plusieurs éléments clés de la logique. Le tableau suivant affiche les différents états d'un workflow et où rechercher plus d'informations sur la raison de l'arrêt.
Action | État du workflow | État de l'exécution de l'activité | Infos sur Terminate ou Suspend |
---|---|---|---|
Exécution normale |
Terminé |
Fermé |
NULL |
TerminateActivity (raison spécifiée et non NULL) |
Arrêté |
En cours d'exécution |
Raison spécifiée dans la conception du Workflow |
TerminateActivity (la raison est NULL) |
Arrêté |
En cours d'exécution |
Une exception de type Workflow Terminated a été levée |
Arrêté par l'application hôte |
Arrêté |
En cours d'exécution |
Raison spécifiée dans le paramètre de méthode Terminate |
Exception non gérée |
Arrêté |
Fermé |
Message de l'exception à l'origine de l'arrêt |
Exception non prise en charge par le gestionnaire d'erreur |
Arrêté |
Fermé |
Message de l'exception à l'origine de l'arrêt |
L'emplacement dans le workflow où une exception a été levée peut être recherché en explorant le graphique du workflow et en vérifiant l'état de chaque activité au moment de l'arrêt. Le code suivant montre comment procéder si l'exception est levée à partir d'une FaultHandlerActivity.
Private Function isExceptionfromFaultHandler(ByVal rootActivity As Activity) As Boolean
If rootActivity Is Nothing Then
Return False
End If
If TypeOf rootActivity Is CompositeActivity Then
If TypeOf rootActivity Is FaultHandlersActivity Then
If rootActivity.ExecutionStatus = ActivityExecutionStatus.Closed Then
Return True
End If
End If
For Each act As Activity In (CType(rootActivity, CompositeActivity)).Activities
If isExceptionfromFaultHandler(act) Then
Return True
End If
Next
End If
Return False
End Function
bool isExceptionfromFaultHandler(Activity rootActivity)
{
if (rootActivity == null)
return false;
if (rootActivity is CompositeActivity)
{
if (rootActivity is FaultHandlersActivity)
{
if (rootActivity.ExecutionStatus == ActivityExecutionStatus.Closed)
return true;
}
foreach (Activity act in ((CompositeActivity)rootActivity).Activities)
if (isExceptionfromFaultHandler(act))
return true;
}
return false;
}
Voir aussi
Concepts
Exécution des workflows
Création du WorkflowRuntime
Copyright © 2007 par Microsoft Corporation. Tous droits réservés.