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. postman使用--发送请求

    概述 上节讲了下接口的基础,从现在来学习怎么测接口.当然,测试接口有很多的工具,比如postman,jmeter等等,或者用代码测试,如果是做接口自动化我当然会选python,如果是调试接口,我特别喜 ...

  2. 任务一:零基础HTML编码

    面向人群: 零基础或初学者 难度: 简单 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容的质量以及学习难度的合理性,但即使如此,真正决定课 ...

  3. python 一些函数和类用法记录

    这一篇主要用来记录在学习过程中遇到的一些觉得有意思的函数或者类的用法,有一些用法感觉很炫酷. 1.collections.defaultdict from collections import def ...

  4. AT2663 Namori Grundy

    题目描述: luogu 题解: 好多细节,比如说每个点有且仅有一条入边. 所以说这个图一定是一个基环外向树. 考虑只是一个环的情况,我们可以发现,当环长为偶数时我们可以$01$交替染色,但环长为奇数时 ...

  5. ajax 实现订单商品数量的增减及订单的删除进行异步更新界面

    [转载]https://blog.csdn.net/luliuying_01/article/details/78177617?locationNum=8&fps=1 由于在做答辩项目,做到购 ...

  6. mysql多字段组合删除重复行

    DELETEFROM boll_paramWHERE id in ( SELECT a.id FROM ( SELECT id FROM boll_param WHERE (symbol, time_ ...

  7. 分享下自己的EmpireofCode进攻策略 https://empireofcode.com/ https://empireofcode.com/game/#

    # 没什么用,该游戏的模块调用不友好,取数据难import queue from battle import commander # import math unit_client = command ...

  8. Druid连接池简单配置

    Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池.插件框架和SQL解析器组成.该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证.统计SQL ...

  9. jQuery+ajax城市联动

    分享一下自己最近写的城市联动.技术使用ajax+jQuery实现. 首先请看前台的javascript代码. 以下是连个实现异步加载的方法. <script type="text/ja ...

  10. vs2015 添加行件

    VS自定义项目模板:[2]创建VSIX项目模板扩展 http://jingyan.baidu.com/article/bad08e1e9b08ee09c851210d.html