在使用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