`
wwwwwhg
  • 浏览: 47519 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
文章分类
社区版块
存档分类
最新评论

通过jbpm源码分析jbpm引擎内核工作原理 & 流程图中的node type

阅读更多
Jbpm,他是jboss下的一个开源项目,是个基于petri net理论为基础的工作流引擎。本文主要通过jbpm源代码分析下jbpm引擎内核工作原理。
        Jbpm是基于微内核引擎的基础上扩展开发出来的工作流平台,其运行的核心包是在org.jbpm.graph下,在该包下又分有action、def、exe、log、node几个包,jbpm内核引擎实现逻辑主要存放在def、exe这两个包下,其他的包是基于此内核扩展出来的动作、模型和日志。
        下面我们通过一个简单的例子来逐步的分析jbpm是如何工作的。看下面jbpm自带演示的一个hello流程(视乎大家都喜欢从hello实现开始^_^),代码如下:
        public void testHelloWorldProcess() {
                ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
                "<process-definition>" +
                " <start-state>" +
                " <transition to='s' />" +
                " </start-state>" +
                " <state name='s'>" +
                " <transition to='end' />" +
                " </state>" +
                " <end-state name='end' />" +
                "</process-definition>"
                );
                ProcessInstance processInstance =new ProcessInstance(processDefinition);
                Token token = processInstance.getRootToken();
                assertSame(processDefinition.getStartState(), token.getNode());
                token.signal();
                assertSame(processDefinition.getNode("s"), token.getNode());
                token.signal();
                assertSame(processDefinition.getNode("end"), token.getNode());
        }
        首先,我们定义个流程模板(ProcessDefinition),就是上面代码的ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(….);这段,在括号中是jbpm定义的流程,其中包括三个环节,分别是starts-state、state和end-state。parseXmlString()方法的主要功能是解析这段xml语言返回个流程模板对象(processDefinition)。
        接着,通过流程实例类(ProcessInstance)来实例化个流程实例,通过传进来的流程模板对象创建ProcessInstance processInstance =new ProcessInstance(processDefinition)。我们来看看new ProcessInstance(processDefinition)到底做了什么,通过查看ProcessInstance的源代码,可以看到其中主要的一段是
        public ProcessInstance( ProcessDefinition processDefinition ) {
            //略去其他代码
            this.processDefinition = processDefinition; //将流程模板对象付给流程实例
            this.rootToken = new Token(this); //创建跟令牌
            //略去其他代码
        }
        我们继续跟进Token这个类
        public Token(ProcessInstance processInstance) {
            //主要一句如下
            this.node = processInstance.getProcessDefinition().getStartState();
        }
        这样就实现了令牌绑定到开始节点。至此,一个流程实例就创建起来了,并且该流程实例走到了开始节点,即令牌所处的位置。
        我们接着往下走token.signal()
        public void signal() {
                signal(node.getDefaultLeavingTransition(), new ExecutionContext(this));
                //这里的getDefaultLeavingTransition()如果有多条路径,则去第一条路径
          }
        void signal(Transition transition, ExecutionContext executionContext) {
            //省略其他代码
            node.leave(executionContext, transition);
            //省略其他代码
        }
        这里的node就是刚才令牌所在的开始节点,我们来看看jbpm是如何将令牌从开始节点移到下个节点的。
        public void leave(ExecutionContext executionContext, Transition transition) {
            Token token = executionContext.getToken();
            token.setNode(this);//此时令牌还在开始节点
            executionContext.setTransition(transition);
            //略去部分代码
        executionContext.setTransitionSource(this);
        transition.take(executionContext);//实现令牌的转移
        }
        我们来看看transition.take(..)方法做了什么
        public void take(ExecutionContext executionContext) {
            //略去部分代码
            to.enter(executionContext);//离开开始节点,进入到下个节点
        }
        大家可能会有点疑问,这个to节点是什么是否初始化的?其实在signal时有句node.getDefaultLeavingTransition(),这句返回Transition对象,该对象就已经初始化了to节点的对象。我们在跟进to.enter(..)
        public void enter(ExecutionContext executionContext) {
            Token token = executionContext.getToken();
            token.setNode(this);//此时令牌就到了名字为“s”的state节点
            token.setNodeEnter(new Date());
            executionContext.setTransition(null);
            executionContext.setTransitionSource(null);
            execute(executionContext);
        }
        在这段代码中的注释这句,真正实现了令牌从开始节点到下个节点了。
        至此,jbpm工作流引擎的内部工作原理就介绍完了,其实这就是工作流引擎最核心的部分了,就是如何从一个环节转移到另一个环节。或许你会说“这么简单,我马上就可以写一个”,其实不然,上面我们所用的例子是十分简单的例子,其实在工作流联盟规范中还有其他复杂的节点模型,如split,join,subflow等。不过幸运的是这些复杂的节点模型jbpm都为我们提供了他自己的默认的实现,这些节点模型都在org.jbpm.graph.node包下。jbpm引擎中很好的抽象了节点模型Node类,大部分的复杂节点模型都继承自Node,我们也可以定制自己的节点,只要实现Node类的execute()方法即可方便的实现。其实从上面分析的代码可以看出,Node类主要的逻辑处理是在leave()、enter()和execute()三个方法,大家可以看下ProcessState,join,fork这些节点模型是如何实现的。



1、task-node
  一个task-node可以包含一个或多个task,这些task分配给特定的user。当流程执行到task-node时,task instance将会被创建,一个task对应一个task instance。task instances 创建后,task-node就处于等待状态。当所有的task instances被特定的user执行完毕后,将会发出一个新的signal 到token,即流程继续执行。
  2、state
  state是一个纯粹的wait state(等待状态)。它和task-node的区别就是它不会创建task instances。很典型的用法是,当进入这个节点时(通过绑定一个action到node-enter event),发送一条消息到外部的系统,然后流程就处于等待状态。外部系统完成一些操作后返回一条消息,这个消息触发一个signal 到token,然后流程继续执行。(不常用)
  3、decision
  当需要在流程中根据不同条件来判断执行不同路径时,就可以用decision节点。两种方法:最简单的是在transitions里增加condition elements(条件),condition是beanshell script写的,它返回一个boolean。当运行的时候,decision节点将会在它的 leaving transitions里循环,同时比较 leaving transitions里的condition,最先返回'true'的condition,那个leaving transitions将会被执行;作为选择,你可以实现DecisionHandler接口,它有一个decide()方法,该方法返回一个String(leaving transition的名字)。
  4、fork
  fork节点把一条执行路径分离成多条同时进行(并发)的执行路径,每条离开fork节点的路径产生一个子token。
  5、join
  默认情况下,join节点会认为所有到达该节点的token都有着相同的父token。join 节点会结束每一个到达该节点的token,当所有的子token都到达该节点后,父token会激活。当仍然有子token处于活动状态时,join 节点是wait state(等待状态)。
  6、node
  node节点就是让你挂自己的action用的(注意:不是event触发!!),当流程到达该节点时,action会被执行。你的action要实现ActionHandler接口。同样,在你的action里要控制流程!
分享到:
评论

相关推荐

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

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

    揭秘jbpm流程引擎内核设计思想及构架.doc

    jbpm流程引擎内核的设计思想和结构是jbpm流程引擎的核心部分,掌握了jbpm流程引擎内核的设计思想和结构,才能真正理解jbpm流程引擎的工作原理,并且能够更好地应用jbpm流程引擎来解决实际问题。 流程引擎内核的设计...

    揭秘jbpm流程引擎内核设计思想及构架.docx

    jbpm流程引擎内核的设计思想和构架对于理解jbpm流程引擎的工作原理和实现机制非常重要,同时对于开发和应用jbpm流程引擎也具有重要的参考价值。 在jbpm流程引擎内核中,还有一些其他重要的技术和概念,例如: 1. ...

    揭秘jbpm流程引擎内核.pdf

    **jbpm流程引擎内核详解** jbpm,全称Java Business Process Management,是一款开源的工作流管理系统,用于构建灵活且可扩展的业务流程应用。它基于模型驱动的设计理念,提供了强大的流程建模、执行和监控能力,是...

    JBPM工作流引擎内核设计思想及构架笔记分享

    JBPM 工作流引擎内核设计思想及构架笔记...本文通过 JBPM 工作流引擎内核设计思想和构架,来帮助读者理解工作流引擎的内核设计思想和结构,并提供了一些有用的信息和建议,来帮助读者更好地理解和应用工作流引擎技术。

    jBPM源码分析jBPM源码分析

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

    jbpm项目源码项目源码

    通过阅读源码,你可以了解jbpm如何实现流程的生命周期管理,如何处理并发和同步问题,以及如何与外部系统(如数据库、规则引擎)交互。这对于深入理解工作流管理系统,提升你的Java和业务流程管理技能非常有帮助。...

    JBPM4.0源码以及分析

    通过阅读源码,我们可以理解流程引擎如何解析JPDL,如何构建流程执行图,以及如何在PVM上执行这些流程。同时,可以研究任务管理是如何实现的,以及如何与外部系统集成,例如通过服务任务调用Web服务。 **4. 文档...

    jbpm源码阅读之一

    描述虽然为空,但我们可以推测博主可能在文章中讨论了如何通过源码理解jbpm的核心概念,如工作流引擎的工作原理,任务调度机制,以及如何实现业务规则的编排和执行。 标签 "源码" 和 "工具" 暗示了这篇文章会深入到...

    JBPM流程引擎设计 工作流资料

    JBPM流程引擎设计是IT领域中的一个重要知识点,尤其对于那些希望理解和实施企业级工作流管理系统的人员来说,它是不可或缺的。 1. **流程建模**:JBPM支持BPMN 2.0(Business Process Model and Notation)标准,这...

    JBPM工作原理及表结构详解

    本文将深入探讨JBPM的工作原理、表结构及其在实际操作中的应用。 1. **JBPM特色** - **灵活的建模**:JBPM支持BPMN 2.0标准,允许用户通过图形化界面设计复杂的工作流程。 - **持久化存储**:JBPM将流程实例和...

    揭秘jbpm引擎内核设计思想及构架.pdf

    《揭秘JBPM引擎内核设计思想及构架》一文深入剖析了JBPM流程引擎的核心设计原理和架构,为理解工作流引擎的本质提供了宝贵的视角。本文不仅揭示了JBPM引擎内核的关键要素,还对比了不同工作流模型的差异,为开发者...

    JBPM流程引擎资料

    JBPM是业务流程管理(BPM)领域的一个灵活且强大的开源工作流引擎,它主要用于建模、执行和监控业务流程。文档《JBPM流程引擎资料》详细介绍了如何利用JBPM开发流程应用,涵盖了从框架构造到节点处理的方方面面。 ...

    JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子

    JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子。带有文档教程和所有源码+JAR包。在网上找了半天jbpm6\jbpm7的资料,都很少。所以 环境:Myeclipse2015 JDK1.7 mysql 5.0 Struts2+Spring3.1 1...

    jbpm和shark工作流引擎对比.doc

    工作流引擎是企业信息化建设中非常重要的一环,选择合适的工作流引擎对企业的业务流程和效率有着巨大的影响。 首先,jbpm和shark工作流引擎都支持Xpdl(xml process definition language)和Bpel(Business Process...

    jbpm开发实例源码

    【jbpm开发实例源码】是一个关于jbpm的实践项目,旨在帮助开发者深入理解并掌握jbpm的工作流引擎。jbpm(Java Business ...通过对源码的深入剖析,不仅可以理解jbpm的工作原理,还能掌握实际项目开发中的最佳实践。

    jbpm工作流引擎介绍

    jbpm(Java Business Process Management)是一款开源的工作流引擎,它为业务流程自动化提供了一套强大的框架。jbpm致力于实现业务流程的建模、部署、执行和监控,是基于Java技术的,因此它天然地适用于Java开发环境...

    揭秘jbpm流程引擎内核设计思想及构架

    如果我们把流程引擎比作工作流系统的“发动机”,那么“引擎内核”则是一个引擎的“灵魂”。 流程引擎内核仅是“满足Process基本运行”的最微小结构,而整个引擎则要复杂很多,包括“状态存储”、“事件处理”、...

    JBPM流程框架源码

    **JBPM流程框架源码详解** JBPM,全称Java Business Process Management,是一个开源的工作流管理系统,用于构建和管理业务流程。它提供了丰富的API、工作流建模工具以及执行引擎,使得开发者能够轻松地实现复杂...

Global site tag (gtag.js) - Google Analytics