`

jbpm流程文件的部署

阅读更多

 一般我们都是用jbpm源程序代码的servlet形式实现流程文件.par文件的部署,或是通过
.parseXMLString("<process-definition>" + "  <start-state>"
      + "    <transition to='s' />" + "  </start-state>"
      + "  <state name='s'>" + "    <transition to='end' />"
      + "  </state>" + "  <end-state name='end' />"
      + "</process-definition>");

这种方式实现,但后一种实现方式不会将流程图片持久会数据库中。

还有一种实现par流程文件的部署,将定义好的流程打包成zip或是par:

File zipFile = new File("./Flows/MyTest_1.zip");
  FileInputStream fIn = new FileInputStream(zipFile);
  ZipInputStream zipIn = new ZipInputStream(fIn);
  ProcessDefinition processDefinition = ProcessDefinition
    .parseParZipInputStream(zipIn);
 这样就可以实现了跟源程序中的servlet部署一样的效果。
那么到底jbpm流程文件是如何实现部署的呢?看以下的解释:

jBPM 为流程定义及其相关文件专门使用了一种打包机制,就是.par文件,似乎JBoss很喜欢这样的形式,之前还有为Hibernate提供的.har包。这个.par被称为Process Archive,故名思义,里面包含了流程需要的所有信息。

其实.par文件就是一个简单的zip格式的压缩包。里面的核心文件是processdefinition.xml这个流程定义,当然用Eclipse jBPM插件制作的流程还含有一个流程图片,可以使用jBPM提供的webapp动态标示当前所执行的流程。除次之外,classes这个目录以内的文件都会被动态加载到内存,因为流程里面定义的Action和Task等的实现类都需要去Classpath找,jBPM会在部署.par包的时候用自己的Class Loader加载进去。(PS:也可以直接放在上层Classpath里面,只要能够加载到就可以)

流程部署详解

如果认为一定要使用Eclipse jBPM插件来部署流程的话,那就错了,jBPM插件从一定程度上简化了jBPM开发,尤其是Deployment功能为大家省了不少事情,但是如果要手工部署,怎么做呢?接下来就要研究一下到底部署这个.par文件的时候做了哪些事情。

首先要让Eclipse jBPM的部署功能有效,那么要确保服务器使用jBPM提供的webapp,并且让起Context位于/jbpm这个位置。例如http://localhost:8080/jbpm,那么在jBPM插件里面写上localhost,端口8080,测试一下连接就可以了。那么我们分析一下webapp,发现原来是org.jbpm.webapp.servlet.UploadServlet这个类在起作用。

看一下UploadServlet的代码,看handleRequest里面的内容,用Commons Fileupload做的文件上传,如果文件小直接加载到内存,文件大会用磁盘的临时空间(Fileupload的文档上有解释)。文件上传完毕,那么就执行doDeployment操作。这个doDeployment才是部署的关键入口。

ZipInputStream zipInputStream = new ZipInputStream(fileItem.getInputStream());

这行代码解释了如何加载.par文件,首先作为Zip格式读取,然后得到jbpmContext来进行流程部署。这个JbpmContext也是采用了ThreadLocal,感觉原理上和Hibernate用的差不多(到这篇文章为止,我在Weblogic还没法成功使用这个得到jbpmContext,还只能用jbpmConfiguration来获取)。
JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream);
jbpmContext.deployProcessDefinition(processDefinition);

 

这样以来,一个流程就这么简单的部署上去了。当然了,如果不想Upload,还可以使用本地文件系统直接部署,需要提供一个URL就可以了,请参考DeployServlet,还可以使用ant进行部署。
这么看来,部署一个流程就变得非常方便了。

部署文件怎么就消失了,到底去了哪里?

在部署完.par流程包之后,仿佛就不再需要这个.par文件了,但是是什么原因能够让服务器不必知道.par的位置而又能每次正常运行这个流程呢?这个问题我诼磨了很久,一个zip文件不可能凭空消失啊,至少他应该存在于引擎可以找到的地方。而这个地方,正是数据库!

看一下jbpm生成的数据库,包含两张比较特别的表jbpm_bytearray和jbpm_byteblock,正是这两张表纯储了.par文件的内容。可以说,他是将zip里面的内容拆开存到了数据库。

mysql> select * from jbpm_bytearray; +-----+----------------------------------+-----------+ | ID_ | NAME_                            | FILEDEFINITION_ | +-----+------------------------------------------+-------+ |  1 | processimage.jpg                             |  1 | |  2 | gpd.xml                                            |  1 | |  3 | processimage.jpg                             |   4 | |  4 | gpd.xml                                            |   4 | |  5 | classes/com/sample/action/MessageActionHandler.class | 4 | +-----+-------------------------------------+------------+

jbpm_bytearray这张表把.par文件目录存了进去,jbpm_byteblock则是将二进制内容存了进去。可以说如果你的.par文件里面含有Java Bytecode,那么引擎会从数据库读出byte[]数组然后作为类加载,如果你的类存在于引擎可见的Classpath,那么他会从那里面加载。

总结

jBPM在流程的部署上着实下了不少功夫,从流程的部署上可以看到jBPM引擎的一些工作方式,这也有点类似IoC的概念,本身jBPM提供了基于有限状态机的编程模型,这一模型大大的简化了编程难度,同时将流程的定义和实现分离出来,使得可以在流程实现的功能子集定义新的流程。
在流程部署上提供了版本机制,即连续部署两个相同的流程会出现版本增量,总是新建高版本的流程,但是低版本的流程在执行过程中不会因为高版本的部署而自动取消,直到运行完毕。

分享到:
评论

相关推荐

    jbpm流程部署文件

    jbpm流程

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

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

    jbpm的一个实例

    JBPM是一个扩展性很强的工作...在这个版本里包括一个JBPM流程设计器的Eclipse插件,和一个用JBOSS作为服务器的示例流程等相关文件。解压jbpm-starters-kit-3.1.2.rar到某个特定目录,这里我们首先用到的是包里的JBPM目

    jBPM 4.4中文用户手册

    译者: Lingo ...jBPM 4.4用户手册 翻译官方文档 JBoss jBPM Teams 4.4 译者: Lingo ... 1.1.... 1.2.... 1.3.... 1.4. 什么是jBPM 1.5.... 1.6. 从jBPM 3升级到jBPM 4 ... 部署流程文件和流程资源 4.2. 部署java类 ..........

    JBPM4.4视频教程(22集附源码)

    资源名称:JBPM4.4视频教程(22集附源码)资源目录:【】(01)jbpm4.4简介【】(02)JBPM4.4开发环境搭建【】(03)jbpm4.4环境搭建续【】(04)jbpm4.4配置文件和开发前准备【】(05)jbpm4.4部署流程发起流程实例【】(06)...

    maven+jbpm4.4+Jboss5.0

    同时,提供了一个简单的JPDL流程,JBPM的相关配置文件,以及测试部分的部署。 注:由于本文开发环境中,包含了Maven对jar的很多索引,导致文件很大(索引文件800多MB),故这不是原生的Demo,我只是将这Demo中的三...

    jBPM4.3用户指南

    4.1. 部署流程文件和流程资源 4.2. 部署java类 5. 服务 5.1. 流程定义,流程实例和执行 5.2. ProcessEngine流程引擎 5.3. Deploying a process部署流程 5.4. 删除流程定义 5.5. 启动一个新的流程实例 5.5.1. ...

    jbpm4.4学习笔记

    6.2部署流程定义 19 6.3删除流程定义 20 6.4查询流程定义 21 6.5获取流程定义文档的资源 22 7 执行流程实例 22 7.1启动流程实例 22 7.2查询我的未完成的个人任务 23 7.3办理任务 24 7.4查询已经完成的任务 25 8流程...

    JBPM-4.4演示请假流程步骤和源代码

    JBPM-4.4演示请假流程步骤和源代码 步骤: 1.首先用MyProcessDesigner_流程设计器设计一个‘请假流程图’,保存成zip根式(属性别忘记写) 2.启动tomcat:startup.bat 3.浏览器访问地址:...

    JBPM4.4用户手册.doc

    4.1. 部署流程文件和流程资源 4.2. 部署java类 5. 服务 5.1. 流程定义,流程实例和执行 5.2. ProcessEngine流程引擎 5.3. Deploying a process部署流程 5.4. 删除流程定义 5.5. 启动一个新的流程实例 5.5.1. 最新的...

    JBPM4工作流应用开始指南.rar

    此外,本篇还可以帮助读者快速上手jBPM4、使用jBPM4开发企业流程应用,包括安装和配置jBPM4、使用jBPM图形化流程设计器(GPD)设计流程、把流程部署到服务器上去、使用jBPM 4 Service API控制流程、掌握jBPM流程定义...

    SSH+JBPM的整合

    简述 使用jbpm-starters-kit-3.1.4生成数据库表及安装eclipse图形化...部署hbm文件到项目 设置大字段string-max 配置configration、template 过滤器的设置与建立 编写发布流程定义xml的人机页面及程序 写在最后

    深入浅出jBPM完整版part1

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

    自己学习jbpm时写的demo

    自己初学jbpm时,写的demo,包含流程的操作,部署流程定义 文件格式,zip格式。查询流程,查询最新流程定义,删除流程定义,检索条件删除流程定义,查看流程图。 tarnsiton state decition forkjoin persontask ...

    JBPM学习笔记——流程设计与控制

    火龙果软件工程技术中心 相关资料:《jBPM学习笔记(V3.2环境部署)》《jBPM学习笔记(框架设计简介)》背景本片文章,我们将从业务流程的设计开始,通过带领大家完成一个完整工作流的程序设计,来学习jPDL的使用。...

    JBPM基于Spring系统工作流平台整合(一)

    1-版本以及系统配置jbpm版本3.2.3...jBPM默认使用的是内存数据库hsqldb|---deploy用来部署你的应用的包和资源|---designer这里是Eclipse插件,这样你就可以在图形界面来定义你的业务流程|---

    流程管理系统,rbac,dwr

    该系统中存在故障单的审批流程,因为流程经常改变,所以该系统引入了工作流引擎JBPM4,这样会使流程和业务逻辑分离,能更好的适应需求,另外需要流程审批的即时性,采用Android和iPhone完成了基于无线的审批流程,...

Global site tag (gtag.js) - Google Analytics