Jbpm流程定义的打包和部署

在使用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_bytearrayjbpm_byteblock两张表存储了流程档案的文件内容,它们把流程档案中的文件拆开了存到了数据库。jbpm-bytearray存储了流程档案的目录,jbpm_bytebolck则是将文件的二进制内容存了进去。对于流程档案中包含的流程定义中ActionTaskJava ByteCode信息(.class文件),引擎会从数据库读出byte[]数组然后作为类加载,如果你的类存在于引擎可见的classpath,那么就会从那里加载,所以说流程所需的.class文件可以打包到流程档案,也可以不打包到流程档案,而是放在你的classpath目录下。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值