经过前面几节的描述,我们基本上让第一个工作流运行起来了,但是很多人肯定都云里雾里的,配置文件为什么要这么些,doAction之流到底有什么用,有这些疑问在正常不过了,初次接触肯定会遇到诸如此类的问题,或许更有甚者,没关系,只要你有耐心阅读,那么我也会耐心的去写(谁怕谁啊!)
1、工作流程
我们为什么要定义helloworld.xml那样的文件,先来说说他所代表的意思吧,看看下面的这张活动图,然后我们在对照着进行解释。
2、详细解释
2.1、初始化节点
回顾一下helloworld.xml文件吧,再对照上面的状态图,其中initial-actions节点中的action代表需要初始化的动作,当一个工作流调用init方法的时候,其中inital-actions中的action将会被执行解析。
<initial-actions>
<action id="100" name="Start Workflow">
<results>
<unconditional-result old-status="Finished" status="Underway" step="1"/>
</results>
</action>
</initial-actions>
上面定义了一个action,并且是在initial时被执行的,在osworkflow中有一个规定,必须至少有一个action子节点在initial-actions中,因为每一个流程都必须进行初始化操作。初始化的时候或许会发生很多凄美的故事,再来说说action,我们定义了他的id是100,它代表action的序列号,而name属性则可以随便起,但是建议起一个能知其意的名字。
osworkflow工作流的流转是需要靠结果进行流转的,因此在action中我们定义了一个results节点,为什么是复数呢?意味着可以有多个result结果,但是必须有一个无条件的结果unconditional-result节点,当有条件的结果都不满足的时候或者没有有条件的结果的时候,无条件结果就会默认被执行(有条件结果集,我们会在后文中讲解),再来看看step属性(old-status和status属性,在后文中介绍),他表示执行完初始化之后,工作流流转到那个步骤,好了再来对照一下刚才的测试代码,其中是不是有一个init方法。
long id = wf.initialize("first", 100, Collections.EMPTY_MAP);
他就代表在workflow初始化的时候执行action中规定的动作。2.2、步骤节点
步骤节点是osworkflow中最重要的概念之一,他是工作流的灵魂所在,对照着上面的状态图以及我们的配置文件,我们来看一下,在osworkflow中,步骤代表一下个流程的流转节点,在osworkflow中至少需要有一个step节点。
<steps>
<step id="1" name="HELLOWORLD1">
<actions>
<action id="1" name="helloWorld action1">
<results>
<unconditional-result old-status="Finished"
status="UnderWay" step="2" />
</results>
</action>
</actions>
</step>
<step id="2" name="HELLOWORLD2">
<actions>
<action id="2" name="helloWorld action2" finish="true">
<results>
<unconditional-result old-status="Finished"
status="UnderWay" step="-1" />
</results>
</action>
</actions>
</step>
</steps>
当初始化完成之后,step指到了step=1这个位置,也就是说目前可执行的step只有1,因此我们运行了下面的代码
wf.doAction(id, 1, Collections.EMPTY_MAP);
当执行完step1的action1之后,result节点有指向了step2节点,我们显示的调用了
wf.doAction(id, 2, Collections.EMPTY_MAP);