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

OSWorkFlow流程配置文件具体解释的更多相关文章

  1. my.cnf 配置文件参数解释

    my.cnf 配置文件参数解释: #*** client options 相关选项 ***# #以下选项会被MySQL客户端应用读取.注意只有MySQL附带的客户端应用程序保证可以读取这段内容.如果你 ...

  2. 分布式文件存储FastDFS(七)FastDFS配置文件具体解释

    配置FastDFS时.改动配置文件是非常重要的一个步骤,理解配置文件里每一项的意义更加重要,所以我參考了大神的帖子,整理了配置文件的解释.原帖例如以下:http://bbs.chinaunix.net ...

  3. 在C#代码中应用Log4Net(三)Log4Net中配置文件的解释

    一个完整的配置文件的例子如下所示,这个是”在C#代码中应用Log4Net(二)”中使用的配置文件. <log4net> <!-- 错误日志类--> <logger nam ...

  4. 在C#代码中应用Log4Net 中配置文件的解释

    一个完整的配置文件的例子如下所示,这个是”在C#代码中应用Log4Net(二)”中使用的配置文件. <log4net> <!-- 错误日志类--> <logger nam ...

  5. log4j配置文件详细解释

    web.xml中配置启动log4j的配置 <!-- webAppRootKey进行配置,这里主要是让log能将日志写到对应项目根目录下 --> <!-- 定义以后,在Web Cont ...

  6. [转]Log4Net中配置文件的解释

    FROM:http://www.cnblogs.com/kissazi2/p/3392605.html 一个完整的配置文件的例子如下所示 <log4net> <!-- 错误日志类-- ...

  7. ANDROID自己定义视图——onLayout源代码 流程 思路具体解释

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简单介绍: 在自己定义view的时候.事实上非常easy.仅仅须要知道3步骤: 1.測量- ...

  8. 【比赛打分展示双屏管理系统-加强版】的两个ini配置文件功能解释及排行榜滚动界面的简答配置等

    加强版目录下有两个ini文件,功能解释如下: 1. ScoreTip.ini: bScoreTip:如果为1,可以启用 回避 功能 或 高低分差值超出 iScoreRange 的 提示功能. iSco ...

  9. Log4Net中配置文件的解释

    一个完整的配置文件的例子如下所示 <log4net> <!-- 错误日志类--> <logger name="logerror"> <le ...

随机推荐

  1. C-基础:关于预编译以及宏

    这是没有引入任何头文件时,如果使用"NULL",编译器会报错:没有定义NULL.此时可用下面代码定义. #undef NULL //#undef 是在后面取消以前定义的宏定义#if ...

  2. 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)

    *题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数) public class 第三十九题按条件计算 ...

  3. python3写冒泡排序

    1.概念理解: 冒泡排序:可以简单的理解为是列表中相近的元素,两两比较,小的在前面.最多需要len()-1次排序. 2.例子:a=[11,7,4,56,35,0] 3.代码实现: 4.输出结果: 第1 ...

  4. 点击增加删除class

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. 洛谷 P3146 248 题解

    https://www.luogu.org/problemnew/show/P3146 区间dp,这次设计的状态和一般的有一定的差异. 这次我们定义$dp[i][j]$表示$[i,j]$的可以合并出来 ...

  6. 洛谷 P1518 两只塔姆沃斯牛

    P1518 两只塔姆沃斯牛 The Tamworth Two 简单的模拟题,代码量不大. 他们走的路线取决于障碍物,可以把边界也看成障碍物,遇到就转,枚举次,因为100 * 100 * 4,只有4个可 ...

  7. Centos 7 编译php 7.2.10

    步骤一:安装依赖 yum install -y wget gcc gcc-c++ gd-devel zlib-devel libjpeg-devel libpng-devel libiconv-dev ...

  8. 【02】SASS与SCSS

    SASS语法 SASS语法也称之为SASS的缩进语法,其目的是担供一个更简洁的语法.对于一些人来说,更多的是基于于CSS的美学吸引力,用SASS来代替SCSS语法. SASS语法和CSS语法不一样,他 ...

  9. 29个非常流行的jQuery提示信息插件

    在网站的设计中,提示信息是非常细微的功能,但是起着非常重要的作用.如果你的网站中提示信息做的比较好,会给浏览者留下非常深刻的印象,同时也会起到非常好的网站宣传效果,下面介绍了30个比较流行提示信息插件 ...

  10. python3 时间复杂度

    时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就 ...