`
humn_chou
  • 浏览: 22584 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jbpm

    博客分类:
  • Jbpm
阅读更多
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这些节点模型是如何实现的。

------------来自网络
分享到:
评论

相关推荐

    jbpm开发指南--jbpm全面介绍

    通过查看JBPM的表,我们知道要实现流程监控功能就是把JBPM当中的JBPM_PROCESSDEFINITION(已发布的流程表),JBPM_PROCESSINSTANCE(流程实例表),JBPM_TASKINSTANCE(流程产生的任务实例表)这三张表串联起来就可以...

    JBPM工作原理及表结构详解

    本文件从JBPM的原理、实现方法、实例等方面详细讲解了JBPM的原理,包括以下内容: 1、JBPM特色: 3 2、流程图的组成: 3 2.1流转 (TRANSITION) 3 2.2活动 (ACTIVITY) 3 3、所用到的表: 4 3.1资源库与运行时表结构:...

    jbpm简介\jbpm简介

    \jbpm简介\jbpm简介\jbpm简介\jbpm简介\jbpm简介

    jbpm jbpm4.3.jar

    jbpm jbpm4.3.jar DDDDDDDD

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

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

    jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍

    jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍jbpm介绍

    jbpm的一个实例

    JBPM是一个扩展性很强的工作流系统,百分百用JAVA语言开发,持久层采用Hibernate实现,理论上说,只要Hibernate支持的数据库JBPM都支持。同时它还能被部署在任何一款JAVA应用服务器上 JBPM的工程文件,大家可以到...

    JBPM采购申请系统——08_JBPM流程节点.7z

    JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM...

    jbpm7示例(jbpm-7.3.0.Final-examples)

    2017年jBPM 正式发布了全新的 7版本。jBPM 是一个完全开源的业务流程管理(BPM)和案例管理解决方案。它支持流程和案例的完整生命周期,从编写工具到执行一直到监控和管理。 在核心引擎之上,提供了许多功能和工具来...

    jbpm安装及使用方法

    在解决“并行”等(比如Fork)问题时,jBpm让Token对象维护了父子关系,这种关系在涉及到Fork的时候会产生。 jBpm让Token这个对象身兼了多种使命: (1)快速定位current state (2)用于fork,join算法 (3)用于...

    生成基于Oracle的jBPM数据库脚本

    解压这个文件,假设解压目录为 "${jbpm.starters.kit}",它的下面应该有 jbpm, jbpm-bpel,jbpm-db,jbpm-designer,jbpm-server 五个子目录。其中我们要用到的是 jbpm 和 jbpm-db两个目录。 2. 导航到 jbpm-db 子...

    JBPM数据库表说明.doc

    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:流程...

    jbpm3.2表说明

    jbpm3.2表说明 很详细 1.1 JBPM_PROCESSDEFINITION:流程模版表 关系表 外键存在表 外键名称 外键存在表字段 存在原因 可能 关系 JBPM_NODE JBPM_NODE FK_PROCST_SBPRCDEF SUBPROCESSDEFINITION_ 子流程的...

    JBPM采购申请系统——06_JBPM版本控制及Token对象.7z

    JBPM采购申请系统——06_JBPM版本控制及Token对象.7z JBPM采购申请系统——06_JBPM版本控制及Token对象.7z JBPM采购申请系统——06_JBPM版本控制及Token对象.7z JBPM采购申请系统——06_JBPM版本控制及Token对象.7z ...

    jbpm4jbpm5

    jbpm应用开发指面(胡奇) jbpm4.3表结构和表字段说明 [jBPM开发指南].高杰.文字版 jBPM5_用户手册-中文版

    jbpm 案例 jbpm jbpm

    jbpm使用案例,非常不错,大家都来看看吧。

    深入浅出jBPM完整版part1

    1 章 helloworld..............................................2 1.1 下载开发套件.............................................2 1.2 安装流程设计器 .........................................7 1.3 jBPM版...

    jbpm 数据库jbpm 数据库

    jbpm 数据库jbpm 数据库jbpm 数据库jbpm 数据库jbpm 数据库

    JBPM的使用与简单的操作

    把JBoss安装到${jbpm.home}/jboss-5.0.0.GA目录 把jBPM安装到JBoss中。 安装hsqldb,并在后台启动。 创建数据库结构 在后台启动JBoss 根据示例创建一个examples.bar业务归档,把它发布到jBPM数据库中 从${jbpm...

    工作流jBPM.jar包

    jBPM是公开源代码项目,使用它要遵循 ASL(Apache License Version 2.0)和EULA(JBoss End User License Agreement)协议。  jBPM在2004年10月18日,发布了2.0版本,并在同一天加入了JBoss,成为了JBoss企业中间件平台...

Global site tag (gtag.js) - Google Analytics