AbstractWorkflow>>
osworkflow中有关工作流流转的所有核心代码都在AbstractWorkflow中,BasicWorkflow就是派生自它,不过这个BasicWorkflow基本上没做什么事情。也许我们还可以从AbstractWorkflow派生自己的Workflow类以加入扩展功能,大概这也算是osworkflow所体现的一种灵活性了,即:允许对工作流流转的执行逻辑进行修改。AbstractWorkflow实现了Workflow接口,该接口包含了有关工作流的核心方法,最重要的是doAction方法,AbstractWorkflow实现了该方法,后面会提及,其他还有一些getter和query
method。
流程流转的执行逻辑>>
当流程执行到的某个step时,可能有一个或多个action可供用户选择执行。一旦确定执行某个action后,我们需要调用AbstractWorkflow.doAction,并传入流程id和action的id。以下是对doAction的执行逻辑的一个不太严紧的算法描述:
- 根据流程id,获得所有当前的step,这种情况往往发生在有split的时候,此时会有多个step等待执行;
- 根据传入的action的id,检查是否是global action;
- 若不是global action,则遍历所有当前的step,对每个step的每个action调用isActionAvailable方法,检查该action是否可用(记住step和action是一对多的关系);
- 所谓可用是指,通过执行passesConditions,逐个检查action的condition:若是OR的关系,则有一个condition为真即为可用,AND关系则类推;
- 若action可用,则调用transitionWorkflow,这是流程流转处理的关键部分;
执行transitionWorkflow时:
- 首先获取当前step,存在有多个当前step的情况,比如split,此时获取首个isAvailableAction为真的step;
- 调用verifyInputs验证输入(如果action有validator的话);
- 执行当前step的post function(因为该step即将结束);
- 执行action的pre function;
- 判断当前step所属的result中的所有condition是否满足要求,判断方法类似action的condition;
- 一旦满足,则获取result的pre function和post function;
- 否则即是unconditional result,获取相应的pre function和post function;
- 在没有split和join的情况下
- 会根据在result中指定的下一个step的id,创建一个新的step,作为当前的step;
- 从current steps中移除原来的当前step,并添加到history steps中;
- 如果新的step有pre function,则会马上执行;
- 执行result的post function;
- 执行action的post function;
- 若action是intial action,则将流程设置为activated状态;
- 若action是finish action,则将流程设置为completed状态,返回true;
- 寻找auto action,若有的话,则执行之,执行方法是调用doAction本身;
- 返回false;
- 根据transitionWorkflow的返回值判断流程是否结束;
- 若返回false,则调用checkImplicitFinish检查是否存在implicit finish,即:当前没有一个step的action可用时,就认为流程应该结束;
- 若存在split,则会创建多个新的step,并且在创建之前先执行split的pre function,在创建之后执行split的post function;
- 创建step的过程和上面描述的普通状况相同:维护好current steps和history steps,并执行新的step的pre function;
- 若存在join,先结束当前step,并将该step添加至history steps和join steps;
- 查找history steps,对每个已完成的step,查看是否在其result或unconditional result中有join一项,若有则加入join steps中;
- 检查join是否已经满足:可以使用Bean Shell,在xml定义文件的join节点中,通过引用一个名为“jn”的特殊变量来指定join的满足条件,jn记录了有关join的关键信息;
- 若条件满足,则执行join的pre function,维护好history steps,并创建下一个step,然后执行join的post function;
- 对于条件循环的情况,可以通过将result的某个action的下一个step指定为自身来加以实现,这只是在xml定义文件中做文章,流程执行逻辑无需做特殊处理;