`
ycyk_168
  • 浏览: 100618 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

JBPM源码解读之:Fork

    博客分类:
  • JBPM
阅读更多

      Fork节点在整个JBPM流程运转过程中配合Join使用提供使多于一个的节点如:TaskNode、State等并行运行的作用,很可惜我们不能利用Fork提供的现有机制实现需求中经常遇到的并发子流程的效果,当然虽然JBPM并不支持并发子流程的机制,并不代表我们不能变通的实现,我将在另一篇文章中详细说明我的并发子流程的实现方式
      Fork类的注释中说:if this fork behaviour is not sufficient for your needs, consider writing your own custom TokenHandler.看来连JBPM开发小组也意识到Fork可能不能满足某些特殊的需求。注释中还说Fork节点有三种配置方式,我很奇怪为什么代码中只能找到两种:
            1、without configuration : in that case the fork will launch one new sub-token over each of the leaving tranisions of the fork node.
            2、a script : can be used to calculate a collection of transition names at runtime. if a script is configured, the script must have exactly one variable with 'write' access. that variable should be assigned a java.util.Collection in the script expression.
     Fork类继承自Node并实现了Parsable接口。Fork类相对简单,他的私有成员变量只有一个:

1/** *//**
2       * a script that calculates the transitionNames at runtime.
3       */

4      Script script = null;

        
        Fork中的Script可以在运行时对Fork节点选择Transition,所以在实际应用中可以使用Fork+Script的方式进行多路路由选择.但是有一点要特别注意:JBBM User Guide文档中说:the script in a fork is not persisted.  script in fork might be removed in later versions of jPDL,原本以为这句话的前半句是说Script不会被持久化进数据库,实验了才知道其实Script还是被存进了数据库,这半句的意思应该是说"fork中的script不被坚持",JBPM开发小组要在新版本中放弃Script,我相信他们一定会提供更好的解决方案,让我们拭目以待。 Fork重写了Node类的read(Element forkElement, JpdlXmlReader jpdlReader)方法,其主要作用是解析JPDL中Fork节点Script的配置,并初始化自己的成员变量script。下面是execute(ExecutionContext executionContext)方法中的相关处理

 1Token token = executionContext.getToken();
 2        // 声明离开转向的集合
 3        Collection transitionNames = null;
 4        //声明子Token容器
 5        List forkedTokens = new ArrayList();
 6
 7        // 如果没有Script,默认按照其父类Node的getLeavingTransitionsMap取得所有离开转向
 8        if (script == null{
 9            transitionNames = getLeavingTransitionsMap().keySet();
10        }
 else 
11            //如果有Script,按照规范该Script应该返回一个Collection类型的数据,作为Fork的离开转向集合
12            Map outputMap = null;
13            try {
14                //执行Script,得到返回的Collection数据
15                outputMap = script.eval(token);
16            }
 catch (Exception e) {
17                this.raiseException(e, executionContext);
18            }

19            if (outputMap.size() == 1{
20                Object result = outputMap.values().iterator().next();
21                if (result instanceof Collection) {
22                    transitionNames = (Collection) result;
23                }

24            }

25            if (transitionNames == null{
26                throw new JbpmException("script for fork '" + name + "' should produce one collection (in one writable variable): " + transitionNames);
27            }

28        }


下面让我们来看一下,Fork产生的子Token的命名方式:

 1    /** *//**
 2     * 功能描述:为子Token取名字<BR>
 3     * @param parent 父Token
 4     * @param transitionName 离开转向的名字
 5     */

 6    protected String getTokenName(Token parent, String transitionName) {
 7        String tokenName = null;
 8        //如果transitionName不为空
 9        if (transitionName != null{
10            //如果父Tokehn中不存在以transitionName命名的子Token
11            if (!parent.hasChild(transitionName)) {
12                //以transitionName的名字为子Token命名
13                tokenName = transitionName;
14            }
 else {
15                //如果已经存在则以transitionName+2的方式命名
16                int i = 2;
17                tokenName = transitionName + Integer.toString(i);
18                //如果加2之后依然存在,开始循环,直到父Token中不存在相同名称的子Token
19                while (parent.hasChild(tokenName)) {
20                    i++;
21                    tokenName = transitionName + Integer.toString(i);
22                }

23            }

24        }
 else {
25            //如果transitionName为空,则判但父Token中是否有子Token,如果有则以parent.getChildren().size() + 1法命名,
26            //如果没有直接命名为1
27            int size = (parent.getChildren() != null ? parent.getChildren().size() + 1 : 1);
28            tokenName = Integer.toString(size);
29        }

30        return tokenName;
31    }


名字定好之后,Fork为每个离开转向分别创建了一个子Token,加入一开始创建的forkedTokens中。最后开始循环列表,执行Node的leave方法,并触发Node-leave事件

iter = forkedTokens.iterator();
        
while (iter.hasNext()) {
            ForkedToken forkedToken 
= (ForkedToken) iter.next();
            Token childToken 
= forkedToken.token;
            String leavingTransitionName 
= forkedToken.leavingTransitionName;
            ExecutionContext childExecutionContext 
= new ExecutionContext(childToken);
            
if (leavingTransitionName != null{
                leave(childExecutionContext, leavingTransitionName);
            }
 else {
                leave(childExecutionContext);
            }

        }

        
        看了这段代码我们应该明白:Fork的Node-leave事件是会执行多遍的,具体要看产生的子Token的个数.至于ForkedToken类,其实是Fork的一个内被类,只起到一个普通Bean的作用.
  到这里,Fork类的大体内容我们已经解读完毕,但是还有一点要注意的地方:
   add some way of blocking the current token here and disable that blocking when the join reactivates this token Then an exception can be thrown by in case someone tries to signal a token that is waiting in a fork.Suspend and resume can NOT be used for this since that will also suspend any related timers, tasks and messages...So a separate kind of blocking should be created for this.

        文章原创,转载请注明出处!

分享到:
评论

相关推荐

    jbpm jbpm4.3.jar

    jbpm jbpm4.3.jar DDDDDDDD

    jbpm源码阅读之一

    标题 "jbpm源码阅读之一" 提到的是对jbpm(Java Business Process Management)源代码的初步探索。jbpm是一个开源的工作流管理系统,它提供了一套完整的框架来处理业务流程,包括流程定义、执行和监控。这篇博客文章...

    jbpm项目源码项目源码

    这个项目的源码提供了深入理解jbpm工作原理的机会,同时也是学习和开发基于jbpm应用的基础。 jbpm的核心功能包括: 1. **流程建模**:jbpm支持BPMN 2.0标准,这是一种用于描述业务流程的图形化语言,允许开发者...

    JBPM数据库表说明 jbpm 工作流 详细到每一个字段,不要下载分

    JBPM数据库表说明 2 1 流程配置类数据库表: 2 1.1 JBPM_PROCESSDEFINITION:流程模版表 2 1.2 JBPM_NODE:流程节点表 2 1.3 JBPM_TRANSITION:流程迁移表 3 1.4 JBPM_ACTION:流程动作表 4 1.5 JBPM_EVENT:...

    jBPM源码分析jBPM源码分析

    jBPM源码分析jBPM源码分析jBPM源码分析jBPM源码分析

    jBPM(八): 也说jBPM + Tomcat + MySQL

    本文主要探讨的是如何将jBPM(一个开源的工作流管理系统)集成到Tomcat应用服务器,并连接MySQL数据库进行数据存储。jBPM是一个强大的业务流程管理(BPM)和工作流系统,它提供了完整的工具集来设计、部署和执行业务...

    jbpm4.4 会签 测试( fork & join)

    在jbpm中,"fork & join"机制是实现并行处理和流程控制的关键概念,尤其在处理会签(多个审批人同时参与审批)等场景时显得尤为重要。 "fork"在jbpm中指的是流程分支,当流程到达一个fork节点时,流程会分裂为多个...

    JBPM4.0源码以及分析

    **JBPM4.0源码解析与分析** JBPM(JBoss Business Process Management)是一款开源的工作流管理系统,它提供了一套完整的业务流程管理解决方案。在JBPM4.0版本中,系统的核心是Process Virtual Machine(PVM)和Job...

    JBPM工作流教程:3个电子书以及JBPM例子程序和源代码

    3个JBPM的经典电子教程: jBPM4.1中文用户手册.pdf jBPM详解_工作流管理系统.doc 深入浅出_jBPM_电子书.doc 以及一个JBPM的HelloWorld的例子

    JBPM数据库表说明

    **JBPM数据库表说明** JBPM(Java Business Process Management)是一个开源的工作流管理系统,它用于设计、执行和管理业务流程。在JBPM中,数据库扮演着至关重要的角色,存储了流程定义、执行实例、任务信息等多种...

    JBPM源码包,包含JBPM的源代码

    【JBPM源码包详解】 JBPM,全称Java Business Process Management,是一个开源的工作流管理系统,主要用于业务流程的建模、执行和管理。它提供了一套完整的框架,使得开发者能够轻松地实现工作流驱动的应用程序。这...

    通过jbpm源码分析jbpm引擎内核工作原理

    通过jbpm源码分析jbpm引擎内核工作原理

    jbpm数据库表说明

    **jbpm数据库表说明** jbpm(Java Business Process Management)是一个开源的工作流管理系统,它用于设计、执行和管理业务流程。在jbpm中,数据库扮演着至关重要的角色,存储了流程实例、任务、变量等核心信息。...

    JBPM4.4所需要的包.rar

    标题中的"JBPM4.4所需要的包.rar"表明这是一个与JBPM 4.4版本相关的压缩文件,包含了一些必要的库和组件。JBPM(Java Business Process Management)是一个开源的工作流和业务流程管理系统,用于设计、执行和管理...

    JBPM源码分析

    ### JBPM源码分析 #### 一、概述 JBPM是一个开源的工作流引擎,它提供了创建、管理和执行业务流程的功能。本文将深入分析JBPM的源码,特别是针对`org.jbpm`包下的几个核心模块,包括但不限于`org.jbpm.bytes`、`...

    jbpm4源码jbpm4源码jbpm4源码

    通过深入研究jbpm4的源码,可以了解其内部实现原理,学习如何构建高效、灵活的流程管理系统,同时也能提升Java编程、企业服务集成等方面的技术能力。对于想要从事企业级工作流管理开发的工程师来说,理解jbpm4源码是...

    jbpm开发实例源码

    【jbpm开发实例源码】是一个关于jbpm的实践项目,旨在帮助开发者深入理解并掌握jbpm的工作流引擎。jbpm(Java Business Process Management)是一个开源的企业级工作流管理系统,它提供了一整套用于设计、执行、管理...

    jbpm4.4项目测试源码下载,

    **jbpm4.4项目测试源码解析** jbpm4.4是一款基于Java的企业级工作流管理系统,由JBoss公司开发。它提供了强大的业务流程管理(BPM)和工作流服务,帮助企业构建灵活且可扩展的流程应用。本源码下载主要针对jbpm4.4...

    jbpm 电子书 下载

    ### jBPM 电子书知识点总结 #### jBPM简介 jBPM是JBoss旗下的一个开源工作...总之,jBPM提供了一整套全面的工作流解决方案,从图形化设计到实际部署,覆盖了业务流程管理的各个阶段,是IT项目中不可或缺的工具之一。

    jbpm4.2 src(JBPM源码)

    **JBPM 4.2 源码分析** JBPM(Java Business Process Management)是一款开源的工作流管理系统,它提供了一套完整的解决方案,用于设计、执行和管理业务流程。JBPM 4.2 是该框架的一个重要版本,包含了丰富的功能和...

Global site tag (gtag.js) - Google Analytics