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. JavaSE-28 hashCode()方法、equals()方法和==相关概念

    概述 Java中,Object类是所有类的基类:如果一个类没有明确继承其他已定义的类,则默认继承Object类. Object类提供了以下方法,对于其他方法,请参考前期专题描述. hashCode() ...

  2. MFC隐藏在黑暗之中的大坑

    大坑一:CDC会随着窗口状态的改变而改变 void K5::OnPaint() { CDC *pDC=this->GetDC(); //CDC最好设为局部变量 ... this->Rele ...

  3. WEB 前端模块化,读文笔记

    文章链接 WEB 前端模块化都有什么? 知识点 根据平台划分 浏览器 AMD.CMD 存在网络瓶颈,使用异步加载 非浏览器 CommonJS 直接操作 IO,同步加载 浏览器 AMD 依赖前置 req ...

  4. C++11程序设计要点总结-模板机制详解

    C++程序设计要点总结 在编程的过程中呢我们总会遇到一些各种各样的问题,就比如在写方法的时候,我们一个同样的方法要写好几种类型的呢,这让我们很伤脑筋,但是呢C++有一个强大的功能就是模板机制,这个模板 ...

  5. MySQL内外联结

    一.内联结(INNER JOIN) MySQL内联结使用INNER JOIN将多个数据表t1,t2隔开,结果是t1里的每一个数据行将与t2里的每一个数据行组合. 逗号连接符.CROSS JOIN和JO ...

  6. Oracle 11G RAC 修改IP

    实验环境 类别 修改前 修改后 PUBLIC 172.18.4.182 rac1 192.168.56.10 rac1 172.18.4.184 rac2 192.168.56.20 rac2 PRI ...

  7. ubuntu mysql配置方案

    Ubuntu常用服务器环境搭建--MySQL篇 MySQL 1.安装MySQL apt-get update apt-get install mysql-server 2.配置MySQL vi /et ...

  8. 【URAL 1989】 Subpalindromes(线段树维护哈希)

    Description You have a string and queries of two types: replace i'th character of the string by char ...

  9. resultType返回的是集合中的元素类型

    https://www.cnblogs.com/start-fxw/p/5900087.html

  10. 一、SQL基础知识点补充

    SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法.但是 SQL 语言也包含用于更新.插 ...