编程方式部署jBPM工作流

 本文介绍了编程方式部署jBPM工作流定义的方法。并向您提供了源代码。只要您正确配置了Jbpm的数据库和Hibernate,使用本文提供的这个工具类,就可以非常方便的部署您创建的jbpm工作流定义。
 
部署jBPM工作流
要使用 jBPM 的工作流,必须首先部署工作流定义。就是把工作流定义文件载入到 jBPM 的数据库中。
jBPM 的工作流有多种部署方式。包括 :Ant 文件部署, Eclipse 图形设计器通过 JBoss ( JBoss 上必需运行 jbpm.war )部署,以及本文我要介绍的编程部署的方式。
一、 Ant 文件发布方式
编写 Ant 文件非常复杂。因为 jBPM 工作流的部署,需要使用 Jbpm 数据库。这就必须要进行繁琐的配置。
二、 Eclipse 图形设计器直接部署
这种方式非常简单。但是,这种部署方式,必须要同时运行 JBoss 服务器。并且需要在 JBoss 上运行配置正确的 jbpm.war 。它会把业务程序定义发布到 jbpm.war 使用的数据库上。
而 jbpm.war 的部署和配置非常麻烦。特别是你要更改使用的数据库时。 JBoss 的一大特点,就是配置方式不标准,与通用的配置方式相差甚多。
因此,我不喜欢配置 JBoss 下的 jbpm.war 。我已经创建了新的,可以部署到 Tomcat 等所有服务器上的 jbpm.war 文件(我会在有空时推出一篇文章介绍如何制作可以运行在所有 JavaEE 服务器上的 jbpm.war 文件,并提供直接下载)。
但是,部署在 Tomcat 上的 jbpm.war ,不能支持 Eclipse 图形设计器部署业务程序定义。
而且,今天我重装 Eclipse 之后,安装的图形设计器没有了发布功能!汗!可能是需要安装 Eclipse 的某些插件吧!今天,我无法访问外国网站,所以找不到原因和解决办法。(又是中国特色)
三、编程方式部署 Jbpm 业务程序(就是常说的“工作流”)定义
因为今天我无法使用 Eclipse 图形设计器直接部署,所以就写了一个类,通过编程的方式直接部署。
这种方式也是非常简单而直接的。不需要再安装 Eclipse 图形设计器,也不需要配置和运行支持 jBPM 的 JBoss 。
只要你的应用程序中集成并正确配置了 jBPM ,(可以参考我的 Blog 上的文章《向应用程序中加入 jBPM 组件》 http://blog.csdn.net/shendl/archive/2006/10/23/1346877.aspx )然后把下面的类加入你的项目,运行 JUnit 测试或者执行 main 方法,就可以轻松的部署你的业务程序定义了!
 
编程方式部署Jbpm工作流定义
一、基本知识
1 , JUnit 测试和执行 main 方法,实际上是 classpath 目标目录下的 .class 文件的运行。查找资源文件,也是从 classpath 开始的。
2 ,我们的 Web 项目应用程序, classpath 是 web-inf/classes 。我们的业务程序定义文件所在目录 processes 设为 src 目录。所以,路径应该是“业务程序定义名字 / processdefinition.xml ”。
这里,我的业务程序定义的名字是 checkShowNews ,所以 classpath 的路径应该是 checkShowNews/processdefinition.xml
 
二、部署业务程序定义的工具类
下面是这个类的源文件,可以通过 Main 方法和 Junit 测试部署业务程序定义。
/**
 *
 */
package com.withub.common.util;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import junit.framework.TestCase;
/**
 * @author 沈东良 shendl_s@hotmail.com
 * 7:21:19 PM
 * DeployJbpmProcessDefinition类,提供了部署JBpm工作流定义到数据库的功能!
 */
public class DeployJbpmProcessDefinition extends TestCase {
  
   static JbpmConfiguration jbpmConfiguration = null;
   static {
   
    jbpmConfiguration = JbpmConfiguration.getInstance();
   }
  
   public void setUp() {
    //创建数据库表
     //jbpmConfiguration.createSchema();
   }
  
   public void tearDown() {
    //删除数据库表
     //jbpmConfiguration.dropSchema();
   }
    /**
     * 测试方法
     *
     */
   public void testSimplePersistence() {
     // Between the 3 method calls below, all data is passed via the
     // database.  Here, in this unit test, these 3 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 in-memory database, we have to
     // deploy the process first.  In reality, this is done once by the
     // process developer.
    /**
     *  这个方法把业务处理定义通过Hibernate保存到数据库中。
     */
     deployProcessDefinition("checkShowNews/processdefinition.xml");
   
   }
   /*
 <process-definition
   xmlns=""  name="checkShowNews">
   <swimlane name="CheckNewsManagers">
       <assignment class="com.withub.wcms.manage.publishNews.jbpmHandler.assignmentHandler.CheckNewsAssignmentHandler" config-type="bean"></assignment>
    </swimlane>
    <swimlane name="EditNewsUser">
       <assignment class="com.withub.wcms.manage.publishNews.jbpmHandler.assignmentHandler.EditNewsAssignmentHandler" config-type="bean"></assignment>
    </swimlane>
    <start-state name="relatingNewsChannel">
       <transition name="" to="checkNews"></transition>
    </start-state>
    <task-node name="checkNews">
       <task name="checkNews" swimlane="CheckNewsManagers"></task>
       <transition name="rejected" to="editNews"></transition>
       <transition name="passed" to="showNews"></transition>
    </task-node>
    <end-state name="end"></end-state>
    <task-node name="editNews">
       <task name="editNews" swimlane="EditNewsUser"></task>
       <transition name="commited" to="checkNews"></transition>
    </task-node>
    <node name="showNews">
       <action name="showNewsAction" class="com.withub.wcms.manage.publishNews.jbpmHandler.actionHandler.ShowNews" config-type="bean"/>
       <transition name="" to="end"></transition>
    </node>
 </process-definition>
 */
   /**
    * "checkShowNews/processdefinition.xml"
    */
   public void deployProcessDefinition(String filePath) {
     // This test shows a process definition and one execution
     // of the process definition.  The process definition has
     // 3 nodes: an unnamed start-state, a state 's' and an
     // end-state named 'end'.
  
  
    ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource(filePath);
  
     // Lookup the pojo persistence context-builder that is configured above
     JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
     try {
       // Deploy the process definition in the database
       jbpmContext.deployProcessDefinition(processDefinition);

     } finally {
       // Tear down the pojo persistence context.
       // This includes flush the SQL for inserting the process definition 
       // to the database.
      /*
       * 关闭jbpm上下文。删除pojo持久化上下文。
       * 这包括刷新SQL来真正的把业务处理定义插入到数据库中。
       * */
       jbpmContext.close();
     }
   }
/**
*
* @param args
*/
   public static void main(String[] args){
   
    DeployJbpmProcessDefinition instance=new DeployJbpmProcessDefinition();
   
    instance.deployProcessDefinition(args[0]);
   
   }
}

<o:p> </o:p>

三、Eclipse下使用main测试的方法

1,点击Run选项:

<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype>

2,选中Main方法测试的

   1)项目-----需要classpath,所有的.class文件、jar包和资源文件所在地。

      2main方法所在的类。

3,由于我们的main方法使用了一个参数,所以需要提供一个参数。就是jBPM业务程序定义文件相对于项目的classpath的相对路径。

4,点Run,运行OK



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值