Jbpm流程定義的打包和部署

在使用Jbpm時,咱們一般的做法是把流程定義存儲到數據庫中,而後在程序中從數據庫中加載流程定義,把流程定義存儲到數據庫中的過程就叫作流程定義的部署。
Jbpm爲其流程定義使用了一種打包機制,即把流程定義及其相關文件打包到一個zip格式的壓縮包中,稱爲流程檔案,而後經過部署這個壓縮包把流程定義存儲到數據庫。
注:如下內容基於數據庫表已經存在的基礎,數據庫表的建立在其餘文章中單獨描述。
1、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>
    這種方式只是集成了第一種方式中的兩個任務。
2、經過編程來完成部署
    除了經過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/napoleonsame/archive/2007/06/19/1658575.aspx
相關文章
相關標籤/搜索