一个step结束后就不再是当前step了,通常一个新的当前step立即产生以使流程继续运转。结束的step的最后的status被设置为old-status属性,这个属性一定要在流程通过新的transition转向新的step之前被设置好,一般的设为Finished。
Transition本身是action的result,一个step可以有多个action,执行哪一个是由端用户,外部事件或者自动触发器来决定。Transition依据action的完成方式来产生。每一个action有至少一个unconditional result和任意个conditional results。
Result,Joins,and Splits
Unconditional Result就是一系列的指示,确定流程的下一步任务。它在状态机中引起流程state的转换。
Conditional Result含有一系列的条件Condition,第一个条件为True的将指示流程状态的转换。
3种Result可能发生:step;split;join。一个告诫:当前的split或者join不能再result到一个split或者Join
对于到达step的情况:
<unconditional-result old-status="Finished" step="2"
status="Underway" owner="${someOwner}"/>
对于到达split的情况:
<unconditional-result split="1"/>
...
<splits>
<split id="1">
<unconditional-result old-status="Finished" step="2"
status="Underway" owner="${someOwner}"/>
<unconditional-result old-status="Finished" step="2"
status="Underway" owner="${someOtherOwner}"/>
</split>
</splits>
对于到达join的情况:
<!-- for step id 6 ->
<unconditional-result join="1"/>
...
<!- for step id 8 ->
<unconditional-result join="1"/>
...
<joins>
<join id="1">
<join id="1">
<conditions type="AND">
<condition type="beanshell">
<arg name="script">
"Finished".equals(jn.getStep(6).getStatus()
&& "Finished".equals(jn.getStep(8).getStatus())
</arg>
</condition>
</conditions>
</join>
<unconditional-result old-status="Finished" status="Underway"
owner="test" step="2"/>
</join>
</joins>
到达join时的情况稍微复杂一些,其中的表达式表示:当id=6和id=8的两个step转移到join并且状态都是finished
External Functions
OSWorkflow定义了functions方法来执行外部的业务逻辑和应用服务,分为两类:pre & post step functions。
Pre functions在流程进行转移(transition)之前调用,通常是一些简单快速的应用。
Post functions和pre functions在同一个应用范围中,只是他们是在流程状态发生改变以后才被调用,通常是耗时的应用。
Functions可以在两个不同的位置指名:steps和actions。
对于定义在actions上的functions:
pre-func -> action -> post-func ==> next step
对于定义在step上的functions:
action -> pre-func -> step state change -> post-func -> next step
Validators
validator就是一些代码,可以校验action的输入。如果通过校验,那么action被执行;否则引发InvalidInputException
Registers
register是一个函数,返回一个公共的对象,通常这个对象可以供整个流程使用,比如文件,原数据,任务等等。
<registers>
<register name="doc" class="com.acme.DocumentRegister"/>
</registers>
...
<results>
<result condition="doc.priority == 1" step="1" status="Underway"
owner="${someManager}"/>
<unconditional-result step="1" status="Queued"/>
</results>
Variable Interpolation
在condition,function,validator,register中都会使用参数。象status,old-status,owner等流程描述符都会被动态解析,一般的变量定义为${foo}。OSWorkflow看到了这样的变量,就会在transientVars Map里面查找,如果找不到就到PropertySet中查找,如果还是找不到,那么就设置为空。
值得注意的是,如果一个参数是字符和变量的混合体,那么就会被认为是字符。比如下面
<arg name="foo">${someDate}</arg> <!-- variable>
<arg name="bar"> ${someDate} </arg> <!-- string, note the extra spaces -->
Auto actions
自动执行action。只要将指定的action的auto属性设置为“true”即可。
Workflow Instance State
当一个流程实例被创建,它处于CREATED状态。一旦action被执行,那么自动变为ACTIVATED状态。一旦流程不可能再进一步执行的时候,状态变为COMPLETED。在流程实例运行过程中,调用者可以结束和暂停流程,对应的状态为KILLED和SUSPENDED