[原创] JWFDv0.96工作流引擎设计--节点回退算法说明

 

 

            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_time s()来实现本操作 

 

汇聚节点 处理步骤完成


 

如果当前正在处理的节点是 普通节点

 

 

普通节点 处理步骤如下

 

 

1:对当前节点的 活动状态值 (对应的数据库表名 step_main  字段名 is_active   )进行 " 尚未处理 " 函数处理过程     具体操作函数为" set_noactived_step ()

 

2:对当前节点的 处理次数状态值 (对应的数据库表名 step_main  字段名 actioned_time ),进行清零函数处理 ( 这里的清零处理的设计估计有点问题,如果一个节点已经进行回退处理了,那么它的处理次数应该算回退这次吗?而不是 0 次处理?大家可以对这个问题思考下 )   具体的操作函数为 " set_Actioned_time s()"

 

3 对当前节点的 回退计数器 (对应的数据库表名  step_main  字段名 rollback_time 增加 1 次处理次数( +1 ),具体的操作使用函数 set_rollback_time s() 来实现本操作 

 

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_time s()"

 

3 对前驱节点的 访问计数器 (对应的数据库表名  step_main  字段名 visited   增加 1 次访问计数( +1 ),具体的操作使用函数 set_visited_times () 来实现本操作 

 

4 对前驱节点的 回退计数器 (对应的数据库表名  step_main  字段名 rollback_time 增加 1 次处理次数( +1 ),具体的操作使用函数 set_rollback_time s() 来实现本操作 

 

 

----------------------------------------------------------------------------------------------------------------------

 

如果前驱点( prestepid ) 普通节点( 如果前驱点是普通节点,那么将其状态值恢复为尚未处理的数值恰当呢?还是恢复为正在处理恰当呢?尚未处理是0, 正在处理是 1, 这里还存在着尚未明确的地方 )

 

 

1:对前驱节点的 活动状态值 (对应的数据库表名 step_main  字段名 is_active   )进行 " 正在处理 " 函数操作    具体操作函数为" set_actived_step ()

 

2:对前驱节点的 处理次数状态值 (对应的数据库表名 step_main  字段名 actioned_time ),进行数值置 0 处理,具体的操作函数为 " set_Actioned_time s()"

 

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

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值