OSWorkFlow流程配置文件具体解释

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定义文件里做文章,流程运行逻辑无需做特殊处理。 

原文地址:https://www.cnblogs.com/yxysuanfa/p/6909781.html