您的位置:首页 > 产品设计

Jbpm流程定义的打包和部署

2009-06-07 10:23 309 查看
在使用Jbpm时,我们通常的作法是把流程定义存储到数据库中,然后在程序中从数据库中加载流程定义,把流程定义存储到数据库中的过程就叫做流程定义的部署。
Jbpm为其流程定义使用了一种打包机制,即把流程定义及其相关文件打包到一个zip格式的压缩包中,称为流程档案,然后通过部署这个压缩包把流程定义存储到数据库。
注:以下内容基于数据库表已经存在的基础,数据库表的创建在其他文章中单独描述。
一、Ant任务完成打包和部署
Jbpm发行包中定义了ant任务来完成打包和部署任务。
1.打包流程档案
我们可以参考build.xml(位于入门套件解压后的jbpm文件夹中)中的build.processes任务,如下:
<target name="build.processes" depends="compile" description="builds the example processes">
<mkdir dir="build/websale/classes" />
<copy todir="build/websale">
<fileset dir="src/process.examples/websale.par" />
</copy>
<copy todir="build/websale/classes">
<fileset dir="build/classes.examples" includes="org/jbpm/websale/**" />
</copy>
<zip destfile="build/websale.process">
<fileset dir="build/websale" />
</zip>
</target>
这个任务是用来打包流程定义的,它依赖于compile任务,compile是用来编译Jbpm项目的,如果我们自己的项目已经有独立的编译机制,则无需依赖这个任务,只需要拷贝相关文件到指定的打包目录即可。通过这个任务我们可以看到,流程档案中不仅仅包括了流程定义文件,还可以包括其它相关文件,如流程定义的图片文件、流程定义中Action和Task等的实现类的Java ByteCode(即.class文件)等信息。在上面任务中把流程档案打包为websale.process文件,实际使用时流程档案文件的扩展名可以任意。
有以下几点需要注意:
每个流程档案只能打包一个流程定义,如果有多个流程定义则需要打包多个流程档案;
在每个流程档案包的第一层中必须包含流程定义的核心文件processdefinition.xml;
.class文件必须存在于classes目录中。
如下结构:
process1.zip
--processdefinition.xml
--classes
process2.zip
--processdefinition.xml
--classes

2.部署流程档案
(1)第一种方式
我们可以参考build.depoly.xml(位于入门套件解压后的jbpm文件夹中)中的deploy.processes任务,如下:
<target name="deploy.processes" depends="declare.jbpm.tasks" description="deploys the jbpm processes">
<ant antfile="build.xml" target="build.processes" inheritall="false" />
<deployprocess cfg="src/config.files/hibernate.cfg.xml"
properties="${basedir}/src/resources/hsqldb/create.db.hibernate.properties">
<fileset dir="build" includes="*.process" />
</deployprocess>
</target>
这个任务是用来部署流程档案的,它依赖declare.jbpm.tasks任务(declare.jbpm.tasks任务定义了Jbpm实现的有关部署流程定义的的Ant任务,如标签中的deployprocess,我们暂且不讨论,后面会介绍该任务)。首先它会调用build.xml中的build.processes任务来打包流程档案,然后会使用Jbpm自己实现的ant任务(标签deployprocess)来部署流程档案。部署时需要两个配置文件hibernate.cfg.xml(位于入门套件解压后的jbpm\src\config.files文件夹中)和create.db.hibernate.properties(位于入门套件解压后的jbpm\src\resources\hsqldb文件夹中),这两个文件指定了Hibernate的配置信息,可以直接从发行包中拷贝使用,具体位置和数据库连接信息根据实际情况调整。任务中所发布的流程档案文件在build目录下,扩展名为process,这些可以根据实际情况并结合打包任务build.processes进行相应调整。
下面我们说一下declare.jbpm.tasks,如下:
<target name="declare.jbpm.tasks">
<ant antfile="build.xml" target="build" />
<taskdef file="src/java.jbpm/org/jbpm/ant/jbpm.ant.tasks.properties" format="properties">
<classpath refid="classpath.ant" /
</taskdef>
在我们项目中使用时可以删除<ant antfile="build.xml" target="build" />,它仅仅是用来构建Jbpm项目的。
declare.jbpm.tasks任务的主要工作是定义了Jbpm实现的有关部署流程定义的的Ant任务标签,它需要配置文件jbpm.ant.tasks.properties(位于入门套件解压后的jbpm\src\java.jbpm\org\jbpm\ant文件夹中),可以直接从发行包中拷贝使用,具体位置根据实际情况设定。classpath.ant定义为指向Jbpm库(还包括相关库,如Hibernate相关库)。
(2)第二种方式
呵呵,第一种方式看起来是不是有点烦琐:)这只是发行包种采用的方式,对于我们使用时,可以使用下面的稍简化方式:

<target name="deploy.processes2" depends="" description="deploys the jbpm processes">
<taskdef name="deployprocess" classname="org.jbpm.ant.DeployProcessTask">
<classpath refid="classpath.ant" />
</taskdef>
<deployprocess process="build/process1.process"
cfg="config.files/hibernate.cfg.xml"
properties="config.files/create.db.hibernate.properties">
<!--多个流程档案时使用fileset元素
<fileset dir="build" includes="*.process" />
-->
</deployprocess>
</target>
这种方式只是集成了第一种方式中的两个任务。
二、通过编程来完成部署
除了通过Jbpm提供的Ant任务进行流程定义的部署之外,还可以通过编程来完成。如下代码:
//获取配置实例,默认是根据default.jbpm.cfg.xml。
//也可以根据指定的配置文件获取配置实例。
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();

//创建数据库表,如果数据库表已经存在,则可以省略这一步
//jbpmConfiguration.createSchema();

//从流程档案中加载流程定义,此处的流程档案文件process1.proces是已经打包好的。
//也可以通过其他方式加载流程定义,比如从XML文件中
ProcessDefinition processDefinition = ProcessDefinition.parseParResource("process1.process");

//获取上下文
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();

try {
// 部署流程定义
jbpmContext.deployProcessDefinition(processDefinition);

} finally {
jbpmContext.close();
}
以上代码的执行还需要依赖Hibernate的配置文件hibernate.cfg.xml。
流程档案部署后,就不再需要这个压缩包及其中的文件了,这是为什么?这是因为数据库中的jbpm_bytearray和jbpm_byteblock两张表存储了流程档案的文件内容,它们把流程档案中的文件拆开了存到了数据库。jbpm-bytearray存储了流程档案的目录,jbpm_bytebolck则是将文件的二进制内容存了进去。对于流程档案中包含的流程定义中Action和Task等Java ByteCode信息(.class文件),引擎会从数据库读出byte[]数组然后作为类加载,如果你的类存在于引擎可见的classpath,那么就会从那里加载,所以说流程所需的.class文件可以打包到流程档案,也可以不打包到流程档案,而是放在你的classpath目录下。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mrshan/archive/2006/08/19/1097824.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 休闲