一般我们都是用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流程
JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子。带有文档教程和所有源码+JAR包。在网上找了半天jbpm6\jbpm7的资料,都很少。所以 环境:Myeclipse2015 JDK1.7 mysql 5.0 Struts2+Spring3.1 1...
JBPM是一个扩展性很强的工作...在这个版本里包括一个JBPM流程设计器的Eclipse插件,和一个用JBOSS作为服务器的示例流程等相关文件。解压jbpm-starters-kit-3.1.2.rar到某个特定目录,这里我们首先用到的是包里的JBPM目
译者: 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集附源码)资源目录:【】(01)jbpm4.4简介【】(02)JBPM4.4开发环境搭建【】(03)jbpm4.4环境搭建续【】(04)jbpm4.4配置文件和开发前准备【】(05)jbpm4.4部署流程发起流程实例【】(06)...
同时,提供了一个简单的JPDL流程,JBPM的相关配置文件,以及测试部分的部署。 注:由于本文开发环境中,包含了Maven对jar的很多索引,导致文件很大(索引文件800多MB),故这不是原生的Demo,我只是将这Demo中的三...
4.1. 部署流程文件和流程资源 4.2. 部署java类 5. 服务 5.1. 流程定义,流程实例和执行 5.2. ProcessEngine流程引擎 5.3. Deploying a process部署流程 5.4. 删除流程定义 5.5. 启动一个新的流程实例 5.5.1. ...
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演示请假流程步骤和源代码 步骤: 1.首先用MyProcessDesigner_流程设计器设计一个‘请假流程图’,保存成zip根式(属性别忘记写) 2.启动tomcat:startup.bat 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、使用jBPM4开发企业流程应用,包括安装和配置jBPM4、使用jBPM图形化流程设计器(GPD)设计流程、把流程部署到服务器上去、使用jBPM 4 Service API控制流程、掌握jBPM流程定义...
简述 使用jbpm-starters-kit-3.1.4生成数据库表及安装eclipse图形化...部署hbm文件到项目 设置大字段string-max 配置configration、template 过滤器的设置与建立 编写发布流程定义xml的人机页面及程序 写在最后
1 章 helloworld..............................................2 1.1 下载开发套件.............................................2 1.2 安装流程设计器 .........................................7 1.3 jBPM版...
自己初学jbpm时,写的demo,包含流程的操作,部署流程定义 文件格式,zip格式。查询流程,查询最新流程定义,删除流程定义,检索条件删除流程定义,查看流程图。 tarnsiton state decition forkjoin persontask ...
火龙果软件工程技术中心 相关资料:《jBPM学习笔记(V3.2环境部署)》《jBPM学习笔记(框架设计简介)》背景本片文章,我们将从业务流程的设计开始,通过带领大家完成一个完整工作流的程序设计,来学习jPDL的使用。...
1-版本以及系统配置jbpm版本3.2.3...jBPM默认使用的是内存数据库hsqldb|---deploy用来部署你的应用的包和资源|---designer这里是Eclipse插件,这样你就可以在图形界面来定义你的业务流程|---
该系统中存在故障单的审批流程,因为流程经常改变,所以该系统引入了工作流引擎JBPM4,这样会使流程和业务逻辑分离,能更好的适应需求,另外需要流程审批的即时性,采用Android和iPhone完成了基于无线的审批流程,...