WF的异常捕获与资源补偿
有朋友提到想了解"错误处理和节点回退"
在这里先明确几个概念:
1.错误处理:也叫异常捕获,通常是指当前逻辑单元块出现异常后,为了防止崩溃的一种处理方案
2.事务处理:通常是指当前逻辑单元块出现异常后,将前面所作的操作恢复原状的一种保证数据操作完性的一种处理方案
3.节点回退
我这里我并不清楚这位朋友具体是指什么
很多刚接触工作流的朋友总会提到一个词"流程回退",我不知道这个词最初的来源,
但是,业务流程是不能回退的,在真实的业务领域中也不存在"事务"这一概念
支票写错了,不能用象皮擦掉,也不能随手撕掉,只能标记为作废
业务数据添错了,不能delete也不能update,只能insert一条冲账
同样,在公文流转中也有一句名言,"一纸入公门,九牛拉不回",
即然没有回退,那"补齐补正"、"发回重审"是什么,那不是回退,是法定的例外情形,是真实业务流程的Else分支
那么,"错误处理和节点回退",我通常把"节点回退"认为是指"资源补偿"
4.资源补偿:通常是指当前逻辑单元正常完成,由于其他逻辑单正元出现异常后,原成的逻辑单元再作些什么事情以适应由异常引发的新状况
补偿与事务处理、异常捕获的区别:事务处理、异常捕获都是对当前逻辑单元块的异常作出的补救行为,补偿得发生则是由其他逻辑单元的异常引起的
一个例子:
举行活动,张三负责通知嘉宾,李四负责准备场地
张三打电话通知嘉宾时,发现电话是错号,告之活动负责人, 这是异常处理
张三在3号给嘉宾打电话告之5号参加活动,李四在4号告诉张三这场地有问题,活动无法如期近行,张三再次打电话通知嘉宾,这是补偿
张三打电话通知嘉宾,当得知嘉宾可以如期参与时,告诉嘉宾在4号晚上在回个电话,以相互确认一下,这是事务
注意一点:张三打电话通知嘉宾时,拨错电话的行为,不要放到异常处理里,对象使用前作一下非空判处,而不要直接放到Try里,这是我常说的
还要注意一点:不要将补偿写成事务,事务要恢复原状,补偿可以变通补救。李四在4号告诉张三这场地有问题,活动无法如期近行,张三可以发一个取消活动的通知,这有点像事务,但要注意,张三也可以发一个活动延期的通知
好了,不废话了,事物这个话题我已写了20多篇了,本文就不提了,下面介绍一下的异常捕获与资源补偿WF应用
1 异常捕获 FaultHandlersActivity、FaultHandlerActivity
1.1 说明
1. FaultHandlersActivity异常捕获容器为Activity组件提供了一个异常捕获与处理的接口
2. 只有实现的Activity组件,才有FaultHandlersActivity异常捕获容器
3. 在异常捕获容器内要使用FaultHandlerActivity异常捕获组件去捕获并处理当前Activity组件的异常
4. 异常捕获容器内可以添加多个FaultHandlerActivity异常捕获组件
5. 要为FaultHandlerActivity异常捕获组件指定要捕获的异常类型,通过FaultTyp属性设置
6. FaultHandlerActivity异常捕获组件,提供了一个容器,可以在其中添加异常处理
7. 有FaultHandlersActivity异常捕获容器,可以在设计器中切换到FaultHandlersActivity容器设计界面
在可视化设计时可用发下方式切换到该容器
自定义System.Exception派生类,要想参与实例的持久化,需要在定义时添加[Serializable]标记
如果没有异常捕获,遇到异常,流程将终止,如果有异常捕获,则处理完异常后,继续运行下一个容器,注是下一容器不是本容器的下一结点
1.2 异常捕获组件 FaultHandlerActivity的使用
1. 一个faultHandlersActivity容器内可以添加多个faultHandlerActivity
2.每个faultHandlerActivity的FaultTyp属性绑定到一个特定的System.Exception派生类
每个faultHandlerActivity都有一个对应的子容器,在该容器内可以添加其他功能类Activity控件
3.当结点产生异常后,如果该异常类型在faultHandlersActivity容器内有相应的faultHandlerActivity绑定,就会执行该faultHandlerActivity对应的子容器中的内容
4.当使用Fault Handlers 容器捕获常后,会执行用Fault Handlers 容器中对应faultHandlerActivity子容器的内容,同时该异常不会触发引擎的OnWorkflowTerminated事件,但会被跟踪监视到
5.使用ThrowActivity组件,与throw 语句、代码错误都可以捕获
2 补偿 CompensatableSequence 、CompensationHandlerActivity 、CompensateActivity
2.1 CompensationHandlerActivity
1. 是可以提供补偿容功能的容器
2. 实现ICompensatableActivity接口的Activity组件,才有该容器,可以通过右键菜单的View Compensation Handler切换到补偿处理器视图
3. CompensatableSequenceActivity和CompensatableTransactionScopeActivity实现了这个接口
2.2 CompensatableSequenceActivity
1. CompensatableSequenceActivity实现了ICompensatableActivity接口所以可以提供CompensationHandlerActivity容器,可以通过右键菜单的View Compensation Handler切换到补偿处理器视图(图见上)
2. 功能相当于附加了补偿处理程序(Compensation Handler)的Sequence组件
2.3 CompensateActivity
1. 为Compensate组件的TargetActivityName属性指定需要补偿的活动,Runtime就会执行目标的补偿处理程.
2. Compensate组件只能存在于异常容器、补偿容器中.
异常容器
补偿容器CompensationHandlerActivity
2.4 基本使用
添加CompensatableSequence控件,添加正常的操作
切换到CompensatableSequence控件的CompensationHandler容器,添加如果出错的补偿操作
执行:没有throwActivity时,流程正常完成,不会执行补偿容器中的操作,如果遇到throwActivity或其他异常,流程在终止前会执行CompensatableSequence控件的CompensationHandler补偿容器内的代码,执行完成后才终止实例
2.5 当有多个串行的CompensatableSequence时,如出现错误,补偿是从后向前执行的
3 异常捕获与补偿的应用说明
3.1 没有作任何处理时
3.2 如果有异常处理
3.3 如果容器内有补偿容器,且作了补偿设定
3.4 如果容器有异常处理,即便有补偿也不会被执行
3.5 如果容器有异常处理,还想执行补偿