注:这篇文章中所使用的“函数”就是指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()来实现本操作
(既是将该节点的活动状态均设置为未处理的初始状态)
普通节点处理步骤完成
回退操作第一部分结束
-------------------------------------------------------------------------------
对当前节点进行回退处理之后,还要对当前节点的前驱节点进行对应的处理,下面介绍单步回退算法的第二个步骤:前驱节点状态重置过程 (前驱点既当前节点的前面一个节点)
全部内容请下载
JWFDv0.96工作流节点回退算法说明.doc
下载地址 : http://www.cnblogs.com/comsci/favorite/260690.html