osworkflow的基本概念

来源:互联网 发布:matlab linux 编辑:程序博客网 时间:2024/05/17 17:16
Step
大致相当于流程所在的位置。譬如企业年检,年检报告书在企业端算一个step,在工商局算第二个step,在复核窗口算第三个step。每个step可以有多种状态(status)和多个动作(action),用Workflow.getCurrentSteps()可以获得所有当前的step(如果有并列流程,则可能同时有多个step,例如一次年检可能同时位于“初审”step和“广告经营资格审查”step)。
 
Status
流程在某个step中的状态。很容易理解,譬如“待认领”、“审核不通过”之类的。OSWorkflow中的状态完全是由开发者自定义的,状态判别纯粹是字符串比对,灵活性相当强,而且可以把定义文件做得很好看。
 
Action
导致流程状态变迁的动作。一个action典型地由两部分组成:可以执行此动作的条件(conditions),以及执行此动作的结果(results)。条件可以用BeanShell脚本来判断,因此具有很大的灵活性,几乎任何与流程相关的东西都可以用来做判断。
 
Result
执行动作后的结果。这是个比较重要的概念。result分为两种,conditional-result和unconditional-result。执行一个动作之后,首先判断所有conditional-result的条件是否满足,满足则使用该结果;如果没有任何contidional-result满足条件,则使用unconditional-result。unconditional-result需要指定两部分信息:old-status,表示“当前step的状态变成什么”;后续状态,可能是用step+status指定一个新状态,也可能进入split或者join。
 
conditional-result非常有用。还是以年检为例,同样是提交年检报告书,“未提交”和“被退回”是不同的状态,在这两个状态基础上执行“提交”动作,结果分别是“初次提交”和“退回之后再次提交”。这时可以考虑在“提交”动作上用conditional-result。
 
Split/Join
流程的切分和融合。很简单的概念,split提供多个result;join则判断多个current step的状态,提供一个result。
 每个特定流程在任意时刻都有至少一个当前steps,而当前steps也有一个status,这个status值就表示流程实例的status。status的取值可以是Underway或者Queued。
一个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