熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

編程方式部署jBPM工作流

2013-11-23 18:46:03  來源: Java核心技術 

  本文介紹了編程方式部署jBPM工作流定義的方法並向您提供了源代碼只要您正確配置了Jbpm的數據庫和Hibernate使用本文提供的這個工具類就可以非常方便的部署您創建的jbpm工作流定義

   

部署jBPM工作流

  要使用jBPM的工作流必須首先部署工作流定義就是把工作流定義文件載入到jBPM的數據庫中

  jBPM的工作流有多種部署方式包括:Ant文件部署Eclipse圖形設計器通過JBoss(JBoss上必需運行jbpmwar)部署以及本文我要介紹的編程部署的方式

  一Ant文件發布方式

  編寫Ant文件非常復雜因為jBPM工作流的部署需要使用Jbpm數據庫這就必須要進行繁瑣的配置

  二Eclipse圖形設計器直接部署

  這種方式非常簡單但是這種部署方式必須要同時運行JBoss服務器並且需要在JBoss上運行配置正確的jbpmwar它會把業務程序定義發布到jbpmwar使用的數據庫上

  而jbpmwar的部署和配置非常麻煩特別是你要更改使用的數據庫時JBoss的一大特點就是配置方式不標准與通用的配置方式相差甚多

  因此我不喜歡配置JBoss下的jbpmwar我已經創建了新的可以部署到Tomcat等所有服務器上的jbpmwar文件(我會在有空時推出一篇文章介紹如何制作可以運行在所有JavaEE服務器上的jbpmwar文件並提供直接下載)

  但是部署在Tomcat上的jbpmwar不能支持Eclipse圖形設計器部署業務程序定義

  而且今天我重裝Eclipse之後安裝的圖形設計器沒有了發布功能!汗!可能是需要安裝Eclipse的某些插件吧!今天我無法訪問外國網站所以找不到原因和解決辦法(又是中國特色)

  三編程方式部署Jbpm業務程序(就是常說的工作流)定義

  因為今天我無法使用Eclipse圖形設計器直接部署所以就寫了一個類通過編程的方式直接部署

  這種方式也是非常簡單而直接的不需要再安裝Eclipse圖形設計器也不需要配置和運行支持jBPM的JBoss

  只要你的應用程序中集成並正確配置了jBPM(可以參考我的Blog上的文章《向應用程序中加入jBPM組件》 )然後把下面的類加入你的項目運行JUnit測試或者執行main方法就可以輕松的部署你的業務程序定義了!

   

編程方式部署Jbpm工作流定義

  一基本知識

  JUnit測試和執行main方法實際上是classpath目標目錄下的class文件的運行查找資源文件也是從classpath開始的

  我們的Web項目應用程序classpath是webinf/classes我們的業務程序定義文件所在目錄processes設為src目錄所以路徑應該是業務程序定義名字/processdefinitionxml

  這裡我的業務程序定義的名字是checkShowNews所以classpath的路徑應該是checkShowNews/processdefinitionxml

  二部署業務程序定義的工具類

  下面是這個類的源文件可以通過Main方法和Junit測試部署業務程序定義

  /**
 *
 */
package monutil;

  import orgjbpmJbpmConfiguration;
import orgjbpmJbpmContext;
import orgjbpmgraphdefProcessDefinition;

  import junitframeworkTestCase;

  /**
 * @author 沈東良
 * :: PM
 * DeployJbpmProcessDefinition類提供了部署JBpm工作流定義到數據庫的功能!
 */
public class DeployJbpmProcessDefinition extends TestCase {

   static JbpmConfiguration jbpmConfiguration = null;

  static {
   
    jbpmConfiguration = JbpmConfigurationgetInstance();
   }
  
   public void setUp() {
    //創建數據庫表
     //jbpmConfigurationcreateSchema();
   }
  
   public void tearDown() {
    //刪除數據庫表
     //jbpmConfigurationdropSchema();
   }
    /**
     * 測試方法
     *
     */
   public void testSimplePersistence() {
     // Between the method calls below all data is passed via the
     // database  Here in this unit test these methods are executed
     // right after each other because we want to test a complete process
     // scenario情節  But in reality these methods represent different
     // requests to a server
    
     // Since we start with a clean empty inmemory database we have to
     // deploy the process first  In reality this is done once by the
     // process developer
    /**
     *  這個方法把業務處理定義通過Hibernate保存到數據庫中
     */
     deployProcessDefinition(checkShowNews/processdefinitionxml);

   }
   /*

  <processdefinition
   xmlns=  name=checkShowNews>
   <swimlane name=CheckNewsManagers>
       <assignment class=comwithubwcmsmanagepublishNewsjbpmHandlerassignmentHandlerCheckNewsAssignmentHandler configtype=bean></assignment>
    </swimlane>
    <swimlane name=EditNewsUser>
       <assignment class=comwithubwcmsmanagepublishNewsjbpmHandlerassignmentHandlerEditNewsAssignmentHandler configtype=bean></assignment>
    </swimlane>
    <startstate name=relatingNewsChannel>
       <transition name= to=checkNews></transition>
    </startstate>
    <tasknode name=checkNews>
       <task name=checkNews swimlane=CheckNewsManagers></task>
       <transition name=rejected to=editNews></transition>
       <transition name=passed to=showNews></transition>
    </tasknode>
    <endstate name=end></endstate>
    <tasknode name=editNews>
       <task name=editNews swimlane=EditNewsUser></task>
       <transition name=commited to=checkNews></transition>
    </tasknode>
    <node name=showNews>
       <action name=showNewsAction class=comwithubwcmsmanagepublishNewsjbpmHandleractionHandlerShowNews configtype=bean/>
       <transition name= to=end></transition>
    </node>
 </processdefinition>
 */
   /**
    * checkShowNews/processdefinitionxml
    */
   public void deployProcessDefinition(String filePath) {
     // This test shows a process definition and one execution
     // of the process definition  The process definition has
     // nodes: an unnamed startstate a state s and an
     // endstate named end
  
  
    ProcessDefinition processDefinition = ProcessDefinitionparseXmlResource(filePath);
  
     // Lookup the pojo persistence contextbuilder that is configured above
     JbpmContext jbpmContext = jbpmConfigurationcreateJbpmContext();
     try {
       // Deploy the process definition in the database
       jbpmContextdeployProcessDefinition(processDefinition);

  } finally {
       // Tear down the pojo persistence context
       // This includes flush the SQL for inserting the process definition 
       // to the database
      /*
       * 關閉jbpm上下文刪除pojo持久化上下文
       * 這包括刷新SQL來真正的把業務處理定義插入到數據庫中
       * */
       jbpmContextclose();
     }
   }
/**
*
* @param args
*/
   public static void main(String[] args){
   
    DeployJbpmProcessDefinition instance=new DeployJbpmProcessDefinition();
   
    instancedeployProcessDefinition(args[]);
   
   }
}

   

  三Eclipse下使用main測試的方法

  點擊Run選項

  

  選中Main方法測試的

  )項目需要classpath所有的class文件jar包和資源文件所在地

  )main方法所在的類

  由於我們的main方法使用了一個參數所以需要提供一個參數就是jBPM業務程序定義文件相對於項目的classpath的相對路徑

  點Run運行OK!


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25691.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.