[原创] JWFDv0.96工作流引擎设计--节点回退算法说明
来源:互联网 发布:ubuntu jdk1.6 编辑:程序博客网 时间:2024/06/05 06:34
JWFDv0.96工作流引擎设计
----节点回退算法说明
注:这篇文章中所使用的“函数”就是指JAVA语言中的方法
作者 comsci 2010.10.7 四川。成都
算法设计的简要说明
JWFD工作流系统在v0.96版本之前并没有实现回退的功能,在v0.96版本中节点单步回退功能才被使用单一算法函数的方式加入到引擎模块中,但是由于在开发过程中,时间比较紧张,我并没有对这个算法进行详细的说明,以至于使用JWFDv0.96进行二次开发对于其它用户来因为缺乏足够的文档说明而较为困难,因此我决定利用一些时间,为JWFDv0.96编写比较详细的系统设计说明文档系列,这些文档包括JWFD-GUI界面-类关联说明文档,流程引擎基础API函数说明文档,流程建模XML说明文档,流程引擎控制器算法说明文档等,在这些文档的帮助下,相信JWFDv0.96的二次开发对用户来讲是一件相对比较轻松的事情
事实上JWFDv0.96版本设计的的节点回退算法相对其它商业性流程系统非常简单和原始的,我在设计这个回退算法的时候,还没有来得及考虑比较复杂的诸如多步(全流程)回退和嵌入业务数据的恢复这些模型,这样一来整个系统的结构过于复杂而使得流程引擎的设计和升级变得更加复杂和困难,所以暂时没有做这样的设计,而仅仅是通过记忆和修改,保存和恢复回退节点的状态值来实现简单的单步回退的功能,这种设计原理就相对的简单,以至于大家可以一看就明白,也可以从这种设计中体会到流程引擎设计的一些思路,便于自己以后开发引擎的时候,走一条简洁而实用的设计开发道路,如果大家在做项目的时候,需要对项目中应用到的工作流系统增加回退功能,那么可以参考这个设计,但是首先一定要根据自己项目和产品的实际情况来做设计,最好不要照搬照抄。
因为我的水平和经验有限,JWFDv0.96在设计和开发过程中,没有获得比较充分的用户使用过程中的反馈信息,所以很多设计都是根据自己的经验和想法做出来的,这样一来,在系统的结构中必然有一些与实际应用的情况不相适应的地方,这一点希望大家一定要注意
JWFDv0.96工作流引擎-节点单步回退算法设计原理
JWFD的节点单步回退算法分为两个主要操作步骤,分别是当前节点回退处理步骤和前驱节点状态重置步骤,下面就简要介绍下这两个步骤的设计思路
回退算法第一步:当前节点回退处理
(原理图回避了代码包中的函数中传递的变量等数据,方便大家从整体上把握设计思路)
请大家对照JWFDv0.96代码包src中的
org.jwfd.workflowEngines.Algorithm.TopologyAnalysis.java第754-852行的rollback函数代码来理解该算法的JAVA实现
(下面所描述的函数的API说明请参考JWFDv0.96 工作流系统开发包简易说明.doc)
-----------------------------------------------------------------------------------------------------------------
如果当前正在处理的节点(stepid)是汇聚节点
(注释:如果当前节点是汇聚点,那么当它向前回退一步的时候,这就意味着汇聚在它身上的所有其它分支节点的状态都要改变, 这些分支点的状态都要从处理完成变为正在处理中,所以汇聚点的回退是个多节点非线性处理方式,这点完全不同于普通的节点的单步回退)
汇聚节点处理步骤如下
1:对该节点的活动状态值(对应的数据库表名step_main 字段名is_active )进行"尚未处理"具体操作使用函数set_overactived_step() 来实现本操作
(注释:当汇聚点正处于被处理过程中的时候,这个节点的状态一定是“处理中”)
2:对该节点的回退计数器值(对应的数据库表名 step_main 字段名rollback_time) 增加1次处理次数(+1),具体的操作使用函数set_rollback_times()来实现本操作
汇聚节点处理步骤完成
如果当前正在处理的节点是普通节点
普通节点处理步骤如下
1:对当前节点的活动状态值(对应的数据库表名step_main 字段名is_active )进行"尚未处理"的函数处理过程 具体操作函数为"set_noactived_step()
2:对当前节点的处理次数状态值(对应的数据库表名step_main 字段名actioned_time),进行清零函数处理(这里的清零处理的设计估计有点问题,如果一个节点已经进行回退处理了,那么它的处理次数应该算回退这次吗?而不是0次处理?大家可以对这个问题思考下) 具体的操作函数为"set_Actioned_times()"
3:对当前节点的回退计数器(对应的数据库表名 step_main 字段名rollback_time) 增加1次处理次数(+1),具体的操作使用函数set_rollback_times()来实现本操作
4:对当前节点的访问计数器(对应的数据库表名 step_main 字段名visited ) 增加1次访问计数(+1),具体的操作使用函数set_visited_times()来实现本操作
(既是将该节点的活动状态均设置为未处理的初始状态)
普通节点处理步骤完成
回退操作第一部分结束
----------------------------------------------------------------------------------------------------------
对当前节点进行回退处理之后,还要对当前节点的前驱节点进行对应的处理,下面介绍单步回退算法的第二个步骤:前驱节点状态重置过程 (前驱点既当前节点的前面一个节点)
回退算法的第二步的设计思想基本上是这样的:如果我们对当前的节点进行了回退操作,那么这个节点的状态一旦被回退,那么其核心的状态值就会被设置为初始0状态,而这个节点正在操作的行为就会立即转到这个节点的前驱节点(前驱节点就是当前节点的单步回退的前面一个节点)上面去,这一个前驱节点状态重置的过程就是回退算法的第二个步骤
回退算法第二个步骤的原理图
前驱节点状态恢复过程(算法描述过程)
如果前驱点(prestepid)是汇聚节点(下面的处理过程和第一步中的处理类似,只是状态不相同,现在是要将前驱节点的状态从处理完毕恢复成正要被处理的状态)
1:对前驱节点的活动状态值(对应的数据库表名step_main 字段名is_active )进行"正在处理"的函数操作 具体操作函数为"set_actived_step()
2:对前驱节点的处理次数状态值(对应的数据库表名step_main 字段名actioned_time),进行数值重置处理,具体 的操作函数为"set_Actioned_times()"
3:对前驱节点的访问计数器(对应的数据库表名 step_main 字段名visited ) 增加1次访问计数(+1),具体的操作使用函数set_visited_times()来实现本操作
4:对前驱节点的回退计数器(对应的数据库表名 step_main 字段名rollback_time) 增加1次处理次数(+1),具体的操作使用函数set_rollback_times()来实现本操作
----------------------------------------------------------------------------------------------------------------------
如果前驱点(prestepid)是普通节点(如果前驱点是普通节点,那么将其状态值恢复为尚未处理的数值恰当呢?还是恢复为正在处理恰当呢?尚未处理是0,正在处理是1,这里还存在着尚未明确的地方)
1:对前驱节点的活动状态值(对应的数据库表名step_main 字段名is_active )进行"正在处理"的函数操作 具体操作函数为"set_actived_step()
2:对前驱节点的处理次数状态值(对应的数据库表名step_main 字段名actioned_time),进行数值置0处理,具体的操作函数为"set_Actioned_times()"
3:对前驱节点的访问计数器(对应的数据库表名 step_main 字段名visited ) 访问计数(置0),具体的操作使用函数set_visited_times()来实现本操作
前驱节点状态恢复过程结束
节点单步回退算法全部结束
------------------------------------------------------------------------------------------------------------------
算法补充说明:
对于在算法中使用到的几个计数器和控制字段的值的设置和恢复是整个回退算法的关键点,但是由于时间和水平有限,我在JWFDv0.96这个版本中还没有对上面几个控制字段和计数器的数值的设置做更加深入和详细的设计,可能大家在实际项目和产品的开发过程中,需要根据具体的情况,对这些字段和计数器做进一步的设计和开发,有可能访问计数和回退计数器的值在不同的情况下,会同时出现置0或者+1等几种值都具有合理性的特殊情况
另外需要大家注意的是:这里介绍的回退算法仅仅是针对节点的单步回退的操作,而并不能够处理跨节点或者多节点的连续回退这样的相对比较复杂的操作,如果用户要有针对性的开发具有这种功能的流程引擎模块,那么就需要更改流程的数据结构,有针对性的添加节点操作控制计数器或者增加节点在运行控制过程中需要用到的其它的一些控制字段。
我在这里省略了在流程核心运行控制器算法中的条件汇聚JAP计数器的回退控制部分,因为回退操作的加入,使得流程核心运行控制器的条件汇聚的操作变得更加复杂,我将在另外一篇文章专门介绍JWFDv0.96运行控制器的算法结构和详细代码
参考文档
JWFDv0.96的流程节点的数据结构,请参考这篇文章
“JWFDv0.96工作流数据库结构说明.doc”
JWFDv0.96的流程引擎原子操作API说明,请参考这篇文章
“JWFDv0.96 工作流系统开发包简易说明.doc”
JWFDv0.96流程XML模型文档结构说明,请参考这篇文章
“JWFDv0.96 工作流XML结构说明.doc”
JWFDv0.96流程嵌入式公式设计文档结构说明,请参考这篇文章
“JWFDv0.96工作流条件表达式逻辑结构设计.doc”
JWFD的相关文档和代码下载
地址: http://www.cnblogs.com/comsci/favorite/260690.html
- [原创] JWFDv0.96工作流引擎设计--节点回退算法说明
- [原创]JWFDv0.96工作流引擎设计-数据库结构说明
- JWFDv0.96开源工作流引擎设计--节点匹配搜索算法设计说明
- [原创]JWFDv0.96工作流引擎设计--嵌入公式使用和结构说明
- [原创]JWFDv0.96工作流引擎设计-自动运行控制器结构说明
- JWFDv0.96开源工作流引擎设计---XMLTO-数据库解析过程说明
- [原创]JWFDv0.96工作流系统--流程XML文档结构说明
- [原创]JWFDv0.96 结构图说明
- [原创]JWFDv0.96 开源工作流发布前的一些问题说明
- [原创]JWFD工作流引擎设计----节点匹配搜索算法(用于解决条件异步汇聚问题)
- [原创]JWFD工作流引擎设计--节点匹配搜索算法(再讨论)
- [原创]工作流自适应引擎的设计思想(初步)
- .net工作流引擎设计(二):WorkFlowEngine工作流引擎使用简要说明
- 工作流回退策略
- 工作流引擎设计思路
- 工作流引擎设计
- 工作流引擎设计思路
- 工作流引擎设计中的遍历算法的问题
- C#连接远程oracle字符串,返回操作时间代码
- 在GRIDVIEW中合并单元格
- 史上最快的刷迅雷积分的文件(推荐)
- MyEclipse 7.5建类时出现异常
- 游戏程序员所需的知识体系
- [原创] JWFDv0.96工作流引擎设计--节点回退算法说明
- C#绘图双缓冲技术总结
- 数据类型&符号优先级
- C#如何实现标题栏随鼠标移动的效果?
- 举例说明在C#语言ref和out的区别
- java
- C#字符串split函数的用法,单个字符的处理示例
- Win7 快捷方式图标消失
- webservice