And-split,Or-split,And-join,Or-join随机组合后会有怎样的结果?

(我贴在Fire workflow 官方论坛www.fireflow.org里的帖子,copy到这里来接受拍砖)

以前写工作流引擎的时候,最让我困惑的是And-Split,Or-Split,And-Join,Or-Join这么几个流程模式的算法问题。这几个模式的概念当然非常清晰,单个看,其算法也较简单。问题是,如果这些模式随机的组合在一个很大很复杂的流程中,引擎如何保证能够正确的进行逻辑计算?我感觉很少有工作流引擎将这个问题说清楚。
在学习petrinet之前,我实在想不出一个好的算法解决这个问题,因为我的思维被限制在“全局控制”这样一个概念里面。也就是说,engine要能够正确的计算,必须知晓所有的状态。如下图1:如果对"And-join"节点进行汇聚计算,那么引擎必须知晓Or-Join,Activity3,Activity4当前的状态。由于流程的各个分支执行进度不一样,有的快有的慢,所以Or-Join,Activity3,Activity4的当前状态不一定都存在;另一方面,Or-Join,Activity3,Activity4代表的流程分支有可能并不需要执行(例如其转移条件计算结果为false,则对应的流程分支就不会执行),这种情况也会导致Or-Join,Activity3,Activity4的当前状态不一定都存在。这两种情况下,And-Join触发的时机是不一样的 。在第一中情况下 And-Join要继续等待,在第二种情况下,And-Join因该被触发。engine要何区分这两中情况,必须有某种机制知晓当前的“全局”状态,说实在的,我想不出好的机制做到这一点。更何况加入中国特色的流程操作,如自由流、撤销、退回等等的情况下,知晓全局状态更加困难。
图1:
[img]http://nychen2000.iteye.com/upload/attachment/90382/86f79007-e14e-323f-a91d-6378db4d4b08.jpg[/img]

在Fire Workflow中,采用的是“局部控制”(petrinet的运行就是局部控制,理解错了请专家拍砖)。首先,在Fire workflow中,Synchronizer代表工作流子系统的计算逻辑,对应petriNet中的T,所有的分支/汇聚都是由Synchronizer完成。按照PetriNet的定义,Synchronizer的触发条件是:图2,图中act是fire workflow中的activity,相当于PetriNet的S;sync为fire workflow的synchronizer,相当于petriNet的T。而实际的设计中没有搞得那么复杂,Synchronizer的定义的触发条件很简单,就是:token-count-of (Synchronizer)=volume-of (Synchronizer),通俗解释就是Synchronizer当前获得的token数量等于Synchronizer的容量(本来T无容量的概念,我这样变通一下应该是合理的)。
图2
[img]http://nychen2000.iteye.com/upload/attachment/90384/c0b4c7f0-cd7e-3144-9150-74dc261a9e0a.jpg[/img]
同时Fire Workflow规定:
1、Synchronizer的容量=输入Transition的数量 * 输出Transition的数量;
2、Synchronizer输入Transition的权 = Synchronizer的容量 / 输出Transition的数量
3、Synchronizer输出Transition的权 = Synchronizer的容量 / 输入Transition的数量
4、Fire workflow 工作流逻辑的执行不受业务逻辑的影响,即,即使某个transition的条件计算结果为false,也不影响token继续向前传递。(实际上这个不是Fire workflow的规定,为了便于理解,我且这么说吧)

通过上面的各种规定,我们看一下Fire workflow中,Join是如何实现的,如下图3。在该图中S的容量是6,t1,t2,t3的权重都是2,t4,t5的权都是3。那么S汇聚的算法就是:当他收到的Token数量等于6时触发。S一定会收到6个token吗?一定会!根据上面的第4条规定,t1,t2,t3一定会被执行,只是迟早的问题。t1,t2,t3执行后,根据PetriNet的规则,恰好给S带来6个token。也可以看出在Fire workflow中,join的执行不需要了解这个网络当前的状态,只要知道他自己的状态(收到的token数量)即可。

实际上在Fire workflow 中,不必要区分And-Split, Or-Split,And-Join,一切都是Synchronizer,大家可以继续参阅文档《3_各种工作流模式的实现》的第4章“顺序、分支、汇聚”。在Fire workflow 中,没有Or-Join,我认为这个模式是不合理的,以后再论述,欢迎拍砖。
图3
[img]http://nychen2000.iteye.com/upload/attachment/90388/7796510b-8a45-3b0e-8665-1932c1ce1b7e.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值