WF4.0 基础篇 (十六) CompensableActivity 补偿

本节主要介绍WF4的补偿

 

本文例子下载:

http://files.cnblogs.com/foundation/CompensableWorkflow.rar

本文例子说明

WF4.0 基础篇 (十六) CompensableActivity 补偿_第1张图片

WF4.0 基础篇 (十六) CompensableActivity 补偿_第2张图片

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]或流程正常完成时调用

WF4.0 基础篇 (十六) CompensableActivity 补偿_第3张图片

 

WF4.0 基础篇 (十六) CompensableActivity 补偿_第4张图片

 

Compensate 补偿

类名

System.Activities.Statements.Compensate

文件

System.Activities.dll

结构说明

继承 NativeActivity

是一个 sealed类

override 了 [CacheMetadata方法] 与 [Execute方法] 与[Cancel]

[Target] 属性 的类型为[System.Activities.Statements.CompensationToken]

功能说明

[Compensate 补偿] 用来显式调用[ CompensableActivity] 的 [CompensationHandler]

 

 

WF4.0 基础篇 (十六) CompensableActivity 补偿_第5张图片

Confirm 确认

类名

System.Activities.Statements.Confirm

文件

System.Activities.dll

结构说明

继承 NativeActivity

是一个 sealed类

override 了 [CacheMetadata方法] 与 [Execute方法]与[Cancel]

[Target] 属性 的类型为[System.Activities.Statements.CompensationToken]

功能说明

[Confirm 确认]用来显式调用[ CompensableActivity] 的 [ConfirmationHandler]

 

WF4.0 基础篇 (十六) CompensableActivity 补偿_第6张图片

 

CompensableActivity容器 自动执行

ConfirmationHandler 的自动执行

当流程完成时会自动调用所有[CompensableActivity]中的ConfirmationHandler

流程

WF4.0 基础篇 (十六) CompensableActivity 补偿_第7张图片

宿主

//==============================================================

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();

}

结果

WF4.0 基础篇 (十六) CompensableActivity 补偿_第8张图片

 

 

 

CompensationHandler 的自动执行

只有为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]时

当流程在[CompensableActivity]的外部产生异常,才会自动调用[CompensableActivity]中的CompensationHandler

流程

WF4.0 基础篇 (十六) CompensableActivity 补偿_第9张图片

宿主

//==============================================================

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();

}

结果

WF4.0 基础篇 (十六) CompensableActivity 补偿_第10张图片

不为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]

WF4.0 基础篇 (十六) CompensableActivity 补偿_第11张图片

 

 

 

CancellationHandler 的使用

只有为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]时

当流程在[CompensableActivity]的[Body]部分产生异常,才会自动调用[CompensableActivity]中的CompensationHandler

 

CancellationHandler与 CompensationHandler的区别

1.当异常发生在[CompensableActivity]外部时,会调用 [CompensationHandler]

2.当异常发生在[CompensableActivity.Body]部分时,会调用 [CancellationHandler]

3.[CompensationHandler]可以被[Compensate] 显示调用

 

流程

WF4.0 基础篇 (十六) CompensableActivity 补偿_第12张图片

宿主

//==============================================================

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

结果

WF4.0 基础篇 (十六) CompensableActivity 补偿_第13张图片

不为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]

WF4.0 基础篇 (十六) CompensableActivity 补偿_第14张图片

 

 

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]中的内容会被立即执行,这与自动调用不同

流程

WF4.0 基础篇 (十六) CompensableActivity 补偿_第15张图片

宿主

//==============================================================

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();

}

 

结果

WF4.0 基础篇 (十六) CompensableActivity 补偿_第16张图片

 

Compensate 的使用

当在流程中用[Compensate]调用其所对应的[CompensableActivity]的[CompensationHandle]时,[CompensationHandle]中的内容会被立即执行,这与自动调用不同

显示调用[Compensate]时,不需要为 [实例.OnUnhandledException]指定[ UnhandledExceptionAction.Cancel]

流程

WF4.0 基础篇 (十六) CompensableActivity 补偿_第17张图片

宿主

//==============================================================

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();

}

 

结果

WF4.0 基础篇 (十六) CompensableActivity 补偿_第18张图片

 

 

 

 

 

多个/嵌套 CompensableActivity 容器

无异常时

如果有多个[CompensableActivity]或[CompensableActivity]有嵌套时,[ConfirmationHandler]执行顺序是:

在同级别容器中,是从下向上[ConfirmationHandler],在嵌套容器中是从外向内[ConfirmationHandler]

 

WF4.0 基础篇 (十六) CompensableActivity 补偿_第19张图片

WF4.0 基础篇 (十六) CompensableActivity 补偿_第20张图片

有异常,但异常不在CompensableActivity中时

如果有多个[CompensableActivity]或[CompensableActivity]有嵌套时,[ConfirmationHandler]与[CompensationHandler]执行顺序是:

 

1.如果产生异常的[Activity]与[CompensableActivity]在同级别容器中,则该级别的[CompensableActivity]会执行[ConfirmationHandler].

[CompensableActivity]嵌套的[CompensableActivity]会执行[ConfirmationHandler]

WF4.0 基础篇 (十六) CompensableActivity 补偿_第21张图片

WF4.0 基础篇 (十六) CompensableActivity 补偿_第22张图片

 

异常在CompensableActivity中时

如果有多个[CompensableActivity]或[CompensableActivity]有嵌套时,[ConfirmationHandler][CompensationHandler]与[CancellationHandler]执行顺序是:

 

1.如果产生异常的[Activity]与[CompensableActivity]在同级别容器中,则该级别的[CompensableActivity]会执行[ConfirmationHandler].

[CompensableActivity]嵌套的[CompensableActivity]会执行[ConfirmationHandler]

 

2.如果产生异常的[Activity]与[CompensableActivity]具有[父子孙]的直接层级关系,会调用这些具有[父子孙]直接层级关系[CompensableActivity]的[CancellationHandler]

 

WF4.0 基础篇 (十六) CompensableActivity 补偿_第23张图片

WF4.0 基础篇 (十六) CompensableActivity 补偿_第24张图片

 

 

 

 

 

TerminateWorkflow 不会触发CompensableActivity的任何行为

流程

WF4.0 基础篇 (十六) CompensableActivity 补偿_第25张图片

宿主

//==============================================================

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

结果

WF4.0 基础篇 (十六) CompensableActivity 补偿_第26张图片

 

 

你可能感兴趣的:(Activity)