下面来说说OSWorkflow流程实例的结束。
<o:p> </o:p>
在workflow pattern中有一种模式:Implicit Termination(隐性终止)。这种模式描述了这样一种情形:活动集中没有任何可以执行(或有可能执行)的活动,此时流程实例已经不能进行任何操作和运转。
这个和我们通常所说的死锁,不是一回事情:流程的死锁是表示流程实例依然存在可以运行(或必需运行的)的活动实例,但是由于缺少资源而不能执行某项操作而造成流程实例没有正常运行。这种情况最为典型的就是,某一个出差了,但是没有设置代理,造成任务没有执行。
<o:p> </o:p>
在OSWorkflow支持了Implicit Termination。当然OSWorkflow也支持我们最为常用的设置结束点。
<o:p> </o:p>
先说说OSWorkflow对设置结束点的支持,这个是非常容易的,只需要将Step中的某一个Action的属性finish的值设置为“true”即可。
既然这么简单,我为什么还要说呢?
既然一个简单东东还拿来说,那就说明这个东东其实不简单。
让我们来思考一个问题,OSWorkflow为什么会将finish这个属性放在了Action而不是放在了Step上呢?
依据我们通常说理解的:在众多活动节点中,有一个结束节点,这个结束节点表示了流程实例结束的语义。实际上很多工作流引擎都是这么做的,shark,jbpm,yawl等等。
<o:p> </o:p>
这是因为在OSWorkflow的视角中,并没有一个Step这个概念。OSWorkflow真正只有两个视角:State和Action。而step和status只是联合扮演了state的角色。所以在OSWorkflow的执行引擎类中,只有doAction等等操作方法,而没有doStep之类的方法。
对于执行引擎来说,其只知道,任何一种状态,都必然意味着是由某种action所引起的变化结果。Action上设置Finish,表示这个Action只要发生,其产生的结果状态就是“Finish”。——这是FSM(有限状态机)的基本原则——一个Finish状态的产生,就表示整个流程实例的结束。
<o:p> </o:p>
所以想把OSWorkflow的精华理解透彻,就必须在脑海中先暂时放弃“活动”、“结束点”、“起始点”之类的概念。—— 所以在这里顺便说一句额外的话,OSWorkflow其实并不是非常适合刚刚结束工作流的初学者。刚刚接触工作流的人,个人建议还是先钻研钻研WFMC的一些东东,虽然我们都说XPDL这不好,那不好,其实xpdl之中有很多值得参考的思想。
<o:p> </o:p>
<o:p> </o:p>