WF4.0 基础篇 (十六) CompensableActivity 补偿
本节主要介绍WF4的补偿
本文例子下载:
https://files.cnblogs.com/foundation/CompensableWorkflow.rar
本文例子说明
CompensableActivity 补偿容器
补偿使用户可以指定对基于身体活动的成功完成后发生的活动的活动而须采取纠正行动
CompensableActivity 补偿容器
类名 | System.Activities.Statements.CompensableActivity |
文件 | System.Activities.dll |
结构说明 | 继承 NativeActivity<CompensationToken> 是一个 sealed类 override 了 [CacheMetadata方法] 与 [Execute方法] 与[Cancel] override 了 [CanInduceIdle 属性] [Variables] 属性 的类型为[Collection<Variable>]
[Body] 属性 的类型为[Activity] [CancellationHandler] 属性 的类型为[Activity] [CompensationHandler] 属性 的类型为[Activity] [ConfirmationHandler] 属性 的类型为[Activity] 返回值为 System.Activities.Statements.CompensationToken |
功能说明 | [CompensableActivity]中可以定义变量 [CompensableActivity] 是补偿容器,在[CompensableActivity] 中的如下四个容器
[Body]容器,主体 [CancellationHandler]容器,产生[Cancel]行为时调用 [CompensationHandler]容器,当显式调用[Compensate]或流程异常完成时调用 [ConfirmationHandler]容器,当显式调用[Confirm]或流程正常完成时调用 |
Compensate 补偿
类名 | System.Activities.Statements.Compensate |
文件 | System.Activities.dll |
结构说明 | 继承 NativeActivity 是一个 sealed类 override 了 [CacheMetadata方法] 与 [Execute方法] 与[Cancel] [Target] 属性 的类型为[System.Activities.Statements.CompensationToken] |
功能说明 | [Compensate 补偿] 用来显式调用[ CompensableActivity] 的 [CompensationHandler] |
Confirm 确认
类名 | System.Activities.Statements.Confirm |
文件 | System.Activities.dll |
结构说明 | 继承 NativeActivity 是一个 sealed类 override 了 [CacheMetadata方法] 与 [Execute方法]与[Cancel] [Target] 属性 的类型为[System.Activities.Statements.CompensationToken] |
功能说明 | [Confirm 确认]用来显式调用[ CompensableActivity] 的 [ConfirmationHandler] |
CompensableActivity容器 自动执行
ConfirmationHandler 的自动执行
当流程完成时会自动调用所有[CompensableActivity]中的ConfirmationHandler
流程 | |
宿主 | //============================================================== static void workflowCompleted(WorkflowApplicationCompletedEventArgs e) { System.Console.WriteLine("完成,状态:{0}", e.CompletionState.ToString()); }
static void aborted(WorkflowApplicationAbortedEventArgs e) { System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message); }
static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e) { System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message); return UnhandledExceptionAction.Cancel; } //============================================================== static void confirmWorkflow() { WorkflowApplication instance = new WorkflowApplication(new ConfirmWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted); instance.OnUnhandledException = unhandledExceptionl; instance.Aborted = aborted;
instance.Run(); } |
结果 |
CompensationHandler 的自动执行
只有为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]时
当流程在[CompensableActivity]的外部产生异常,才会自动调用[CompensableActivity]中的CompensationHandler
流程 | |
宿主 | //============================================================== static void workflowCompleted(WorkflowApplicationCompletedEventArgs e) { System.Console.WriteLine("完成,状态:{0}", e.CompletionState.ToString()); }
static void aborted(WorkflowApplicationAbortedEventArgs e) { System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message); }
static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e) { System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message); return UnhandledExceptionAction.Cancel; } //============================================================== static void compensateWorkflow() { WorkflowApplication instance = new WorkflowApplication(new CompensateWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted); instance.OnUnhandledException = unhandledExceptionl; instance.Aborted = aborted;
instance.Run(); } |
结果 | |
不为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]时 |
CancellationHandler 的使用
只有为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]时
当流程在[CompensableActivity]的[Body]部分产生异常,才会自动调用[CompensableActivity]中的CompensationHandler
CancellationHandler与 CompensationHandler的区别
1.当异常发生在[CompensableActivity]外部时,会调用 [CompensationHandler]
2.当异常发生在[CompensableActivity.Body]部分时,会调用 [CancellationHandler]
3.[CompensationHandler]可以被[Compensate] 显示调用
流程 | |
宿主 | //============================================================== static void workflowCompleted(WorkflowApplicationCompletedEventArgs e) { System.Console.WriteLine("完成,状态:{0}", e.CompletionState.ToString()); }
static void aborted(WorkflowApplicationAbortedEventArgs e) { System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message); }
static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e) { System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message); return UnhandledExceptionAction.Cancel; } //==============================================================
#region //Cancel 例子 static void cancelWorkflow() { WorkflowApplication instance = new WorkflowApplication(new CancelWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted); instance.OnUnhandledException = unhandledExceptionl; instance.Aborted = aborted;
instance.Run(); }
#endregion |
结果 | |
不为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]时 |
CompensableActivity 显示调用
使用[Confirm]可以显示调用[CompensableActivity]的[ConfirmationHandler]部分
使用[Compensate]可以显示调用[CompensableActivity]的[CompensationHandler]部分
要显示调用[CompensableActivity],需要定义一个[ System.Activities.Statements.CompensationToken]型变量,将[CompensableActivity]的[Result]绑定到该变量上.再将[Confirm]或[Compensate]的[Target]属性绑定到该变量上即可实现显示调用
一个[CompensableActivity]只能被调用一次.调用两次以上会出错
如果[Confirm]调用后,[Compensate]再调用会出错
如果[Compensate]调用后,[Confirm]再调用会出错
[Confirm]或[Compensate]调用后,不会再被自动调用
Confirm 的使用
当在流程中用[Confirm]调用其所对应的[CompensableActivity]的[ConfirmationHandler]时,[ConfirmationHandler]中的内容会被立即执行,这与自动调用不同
流程 | |
宿主 | //============================================================== static void workflowCompleted(WorkflowApplicationCompletedEventArgs e) { System.Console.WriteLine("完成,状态:{0}", e.CompletionState.ToString()); }
static void aborted(WorkflowApplicationAbortedEventArgs e) { System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message); }
static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e) { System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message); return UnhandledExceptionAction.Cancel; } //==============================================================
static void confirmCallWorkflow() { WorkflowApplication instance = new WorkflowApplication(new ConfirmCallWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted); instance.OnUnhandledException = unhandledExceptionl; instance.Aborted = aborted;
instance.Run(); }
|
结果 |
Compensate 的使用
当在流程中用[Compensate]调用其所对应的[CompensableActivity]的[CompensationHandle]时,[CompensationHandle]中的内容会被立即执行,这与自动调用不同
显示调用[Compensate]时,不需要为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]
流程 | |
宿主 | //============================================================== static void workflowCompleted(WorkflowApplicationCompletedEventArgs e) { System.Console.WriteLine("完成,状态:{0}", e.CompletionState.ToString()); }
static void aborted(WorkflowApplicationAbortedEventArgs e) { System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message); }
static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e) { System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message); return UnhandledExceptionAction.Cancel; } //============================================================== static void compensateCallWorkflow() { WorkflowApplication instance = new WorkflowApplication(new CompensateCallWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted); instance.OnUnhandledException = unhandledExceptionl; instance.Aborted = aborted;
instance.Run(); }
|
结果 |
多个/嵌套 CompensableActivity 容器
无异常时
如果有多个[CompensableActivity]或[CompensableActivity]有嵌套时,[ConfirmationHandler]执行顺序是:
在同级别容器中,是从下向上[ConfirmationHandler],在嵌套容器中是从外向内[ConfirmationHandler]
有异常,但异常不在CompensableActivity中时
如果有多个[CompensableActivity]或[CompensableActivity]有嵌套时,[ConfirmationHandler]与[CompensationHandler]执行顺序是:
1.如果产生异常的[Activity]与[CompensableActivity]在同级别容器中,则该级别的[CompensableActivity]会执行[ConfirmationHandler].
[CompensableActivity]嵌套的[CompensableActivity]会执行[ConfirmationHandler]
异常在CompensableActivity中时
如果有多个[CompensableActivity]或[CompensableActivity]有嵌套时,[ConfirmationHandler][CompensationHandler]与[CancellationHandler]执行顺序是:
1.如果产生异常的[Activity]与[CompensableActivity]在同级别容器中,则该级别的[CompensableActivity]会执行[ConfirmationHandler].
[CompensableActivity]嵌套的[CompensableActivity]会执行[ConfirmationHandler]
2.如果产生异常的[Activity]与[CompensableActivity]具有[父子孙]的直接层级关系,会调用这些具有[父子孙]直接层级关系[CompensableActivity]的[CancellationHandler]
TerminateWorkflow 不会触发CompensableActivity的任何行为
流程 | |
宿主 | //============================================================== static void workflowCompleted(WorkflowApplicationCompletedEventArgs e) { System.Console.WriteLine("完成,状态:{0}", e.CompletionState.ToString()); }
static void aborted(WorkflowApplicationAbortedEventArgs e) { System.Console.WriteLine("aborted ,Reason:{0}", e.Reason.Message); }
static UnhandledExceptionAction unhandledExceptionl(WorkflowApplicationUnhandledExceptionEventArgs e) { System.Console.WriteLine("unhandledException:{0}", e.UnhandledException.Message); return UnhandledExceptionAction.Cancel; } //============================================================== #region //Terminate 例子 static void terminateWorkflow() { WorkflowApplication instance = new WorkflowApplication(new TerminateWorkflow());
instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted); instance.OnUnhandledException = unhandledExceptionl; instance.Aborted = aborted;
instance.Run(); } #endregion |
结果 |