jbpm4.3与spring集成

我遇到的问题,注意看:
1、将juel.jar, juel-engine.jar, juel-impl.jar这三个包复制到tomcat6下lib中,并删除原来的el-api.jar,切记要把WEB-INF\lib中的juel.jar, juel-engine.jar, juel-impl.jar删除。不然还是要冲突。


2、java.lang.AbstractMethodError: org.apache.xerces.dom.ElementNSImpl.setUserData(Ljava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/UserDataHandler;)Ljava/lang/Object;

网上说是xerces.jar的版本问题,于是到http://xml.apache.org/dist/xerces-j/下載 Xerces-J-bin.2.9.1.zip 将项目中的xerces-2.6.2.jar給換掉成Xerces-J-bin.2.9.1.zip中的xercesImpl.jar  最下面我提供了下载

3、我用的myeclipse是8.5版本,好像最低要8.0的才能和jbpm4.3的兼容

正文:
jBPM是一个开源工作流软件,后台老大是JBoss。继2009年11月5日jBPM 4.2发布之后,2009年12月29日jBPM 4.3闪亮登场,而jBPM 4.4则计划在2010年3月1日发布。
  为了能对jBPM 4.3快速入手,这里介绍如何安装部署jBPM自带的Demo Setup示例。
一.安装目标 
  我们希望的环境是:tomcat6.0.20为web服务器,MySQL 5.1.11为数据库,Eclipse 3.5 SR1为编辑器,建立一个jBPM的环境并通过jBPM自带的脚本安装Demo Setup。
二.必要的前置工作 
 1.确认JDK版本在1.5以上,ANT版本在1.7以上;
 2.下载jBPM(下载地址 );
 3.解压缩到本地磁盘,然后可以看到如下的目录树结构:
  ${jbpm.home} (这里用${jbpm.home}代表jBPM解压后的根目录,下同)
de>   ├─doc     用户手册、shema docs、javadocs、开发手册
   ├─examples  用户手册中提到的一些示例
   ├─install   几种环境下的安装脚本
   ├─lib     第三方类库和一些特殊的jBPM类库
   ├─migration  详细内容请参考开发手册
   ├─src     源文件
   └─jbpm.jar  jBPM核心类库de>
 4.下载MySQL数据库服务器,并安装和进行基本的配置,并且建立目标数据库(版本5.1以上不限,这里以比较老的5.1.11为例,下载地址 ,如果希望用hsqldb的可以忽略此步骤);
 5.下载tomcat 6.0.20(下载地址 ),放在${jbpm.home}\install\downloads下;
 6.下载Eclipse 3.5 SR1,Eclipse IDE for Java EE Developers或Eclipse IDE for Java and Report Developers版本(下载地址 ),放在${jbpm.home}\install\downloads下;
 注:5、6两步为非必要但建议执行的步骤,如果不执行5、6两步,jBPM将自动从互联网下载,但至于网速……
三.具体安装步骤 
 1.用文本编辑软件打开install/build.xml
  1.1<property name="database" value="hsqldb" />一行里的“hsqldb”改为“mysql”(如果希望用默认的hsqldb的可以不修改);
  1.2<condition property="eclipse.filename" value="eclipse-jee-galileo-win32.zip">一行里的eclipse文件名改为:eclipse- reporting-galileo-SR1-win32.zip(具体名字与下载的Eclipse相同)
 2.修改install/jdbc/mysql.properties文件,设置合适的参数(如果采用hsqldb可以忽略此步);
 3.在命令行模式运行命令:ant demo.setup.tomcat
 4.运行完后会打开eclipse,请关闭eclipse,否则脚本不算运行完成。
  这样Demo Setup就运行完毕了,检验Demo Setup运行是否成功可以登录the Signavio web editor 或the jBPM console ,系统默认的用户名是:alex、mike、peter、mary,默认密码都是:password。
  在脚本运行过程中,执行了以下的任务:
   1.安装tomcat到${jbpm.home}/apache-tomcat-6.0.20目录下;
   2.安装jBPM到tomcat中;
   3.在mysql创建jBPM需要的tables;
   4.在后台启动tomcat;
   5.从examples里创建一个叫examples.bar的业务包,并部署到jBPM DB中;
   6.从${jbpm.home}/install/src/demo/example.identities.sql载入example用户和用户 组;
   7.安装eclipse到${jbpm.home}/eclipse;
   8.安装jBPM web控制台;
   9.安装Signavio web模块;
   10.启动eclipse。

jbpm4.3 eclipse下 hellworld

1.下载JBPM4.3
http://sourceforge.net/projects/jbpm/files/
下载后解压,你将看到有以下的子目录
    * install:安装jbmp所需配置文件
    * doc: 用户手册,javadoc和开发指南
    * examples: 用户手册中用到的示例流程  
    * lib: 第三方库和一些特定的jBPM依赖库
    * src: 源代码
    * jbpm.jar: jBPM主库归档
    *migration:貌似是低版本迁移文件,没用上还

2.下载jdk(标准java5或更高版本)
3.在eclipse官网下载最新版本的eclipse
4.在eclipse上安装GPD插件
步骤如下
    * Help-->Install New Software
    * 点击Add
    * 在Add Site 对话框里点击Archive....
    * 在JBPM4.0 HOME中找到install\src\gpd\jbpm-gpd-site.zip 并点击 '打开'
    * 选择出现的 jPDL 4 GPD 更新站点
    * 点击 下一步.. 然后点击 完成
    * 接受协议..
    * 当它询问的时候重启eclipse


注意:安装过程会很慢,一定要耐心的等待。

5.新建一个java项目,加入jbpm4的依赖包。
*JBPM4_HOME/jbpm.jar
*JBPM4_HOME/lib/*.jar

6.在项目的src目录下点击右键-->New-->JBPM 4 Process Definetion,在弹出的对话框的File Name 中填写hello,该文件是以jpdl.xml为后缀结尾的,然后点击Finish。

7.在hello.jpdl.xml中绘制一个简单的流程图,包含一个start活动,一个state活动和一个end活动,然后用转移(transition)将他们链接起来.
Java 代码

    <?xml version="1.0" encoding="UTF-8"?> 
     
    <process name="hello" xmlns="http://jbpm.org/4.0/jpdl"> 
       <start name="start1" g="247,64,48,48"> 
          <transition name="to state1" to="state1" g="-59,-17"/> 
       </start> 
       <state name="state1" g="254,167,92,52"> 
          <transition name="to end1" to="end1" g="-47,-17"/> 
       </state> 
      <end name="end1" g="244,277,48,48"/> 
   </process> 

<?xml version="1.0" encoding="UTF-8"?>

<process name="hello" xmlns="http://jbpm.org/4.0/jpdl">
   <start name="start1" g="247,64,48,48">
      <transition name="to state1" to="state1" g="-59,-17"/>
   </start>
   <state name="state1" g="254,167,92,52">
      <transition name="to end1" to="end1" g="-47,-17"/>
   </state>
   <end name="end1" g="244,277,48,48"/>
</process>



8.把JBPM4_HOME/examples/src中除org外的文件全部拷贝到你项目下的src目录中。

9.在你项目的src目录下建一个测试类
Java 代码

package com;

import junit.framework.TestCase;

import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;

public class HelloTest extends TestCase {
ProcessEngine processEngine = null; 
String deployId = null; 
//主要是用来发布流程 
RepositoryService repositoryService = null; 
//主要用来启动流程,执行流程 
ExecutionService executionService = null; 

protected void setUp() { 
processEngine = new Configuration().buildProcessEngine(); 
repositoryService = processEngine.getRepositoryService(); 
executionService = processEngine.getExecutionService(); 
//将定义的流程配置文件部署到数据库中 
deployId = repositoryService.createDeployment().addResourceFromClasspath("hello.jpdl.xml").deploy(); 
  } 

         protected void tearDown() { 
             repositoryService.deleteDeploymentCascade(deployId); 
      
         } 
      
         public void testEndHelloWorld() { 
             //启动流程实例 
             ProcessInstance processInstance = executionService.startProcessInstanceByKey("hello"); 
             //启动流程后我们的流程会自动进入到state1活动,并处在等待状态 
             assertTrue(processInstance.isActive("state1")); 
             String pid = processInstance.getId(); 
             //让state1活动继续往下执行,并进入结束活动,流程结束 
             processInstance = executionService.signalExecutionById(pid); 
             assertTrue(processInstance.isEnded()); 
         } 
}

10.运行测试如没有报错说明已成功。




jbpm4.2与spring集成有点问题,直接跟据它自己的“开发指南”提供的方法是不能集成的。在官网查到的信息是发布4.2时,忘记更新集成 spring的文件。不过4.3已经把该bug改过来了。下面是集成方法。

版本:
jbpm4.3
spring3.0
mysql5.1.40

直接从jbpm4.3自带的文件到src目录:
从jbpm-4.3"install"src"cfg"hibernate"jdbc复制mysql.hibernate.cfg.xml到src目录, 文件名改为hibernate.cfg.xml。
从jbpm-4.3"install"src"cfg"spring复制applicationContext.xml到src目录。
从jbpm-4.3"install"src"cfg"jbpm复制spring.jbpm.cfg.xml到src目录,文件名改为 jbpm.cfg.xml。
修改applicationContext.xml、hibernate.cfg.xml的数据库配置信息,jbpm4.3与spring的集成就完成 了,可以自己写测试文件测试,集成非常容易。

不过在applicationContext.xml和hibernate.cfg.xml两个文件都要改数据库信息有点麻烦,所以只复制 applicationContext.xml、spring.jbpm.cfg.xml两个文件到src目录,把hibernate.cfg.xml的 配置整进spring的配置文件applicationContext.xml中。
applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:aop="http://www.springframework.org/schema/aop"
         xmlns:context="http://www.springframework.org/schema/context"
          xmlns:p="http://www.springframework.org/schema/p"
         xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<context:annotation-config />

<bean
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
  p:location="hibernate.properties"
  p:ignoreUnresolvablePlaceholders="true" />
  <bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper" />
  <bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />
  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingResources">
        <list>
            <value>jbpm.repository.hbm.xml</value>
            <value>jbpm.execution.hbm.xml</value>
            <value>jbpm.history.hbm.xml</value>
            <value>jbpm.task.hbm.xml</value>
            <value>jbpm.identity.hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
                <prop key="hibernate.dialect">${dataSource.dialect}</prop>
                <prop key="hibernate.hbm2ddl.auto">${dataSource.hbm2ddl.auto}</prop>
            </props>
    </property>
  </bean>
  <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    <property name="dataSource" ref="dataSource" />
  </bean>
  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${dataSource.driverClassName}" />
    <property name="url" value="${dataSource.url}" />
    <property name="username" value="${dataSource.username}" />
    <property name="password" value="${dataSource.password}" />
  </bean>
</beans>

新建文件hibernate.properties,主要用来配置连接数据库信息
dataSource.password=123
dataSource.username=root
dataSource.databaseName=jbpmdb
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.dialect=org.hibernate.dialect.MySQLInnoDBDialect
dataSource.serverName=localhost:3306
dataSource.url=jdbc:mysql://${dataSource.serverName}/${dataSource.databaseName}
dataSource.properties=user=${dataSource.username};databaseName=${dataSource.databaseName};serverName=${dataSource.serverName};password=${dataSource.password}
dataSource.hbm2ddl.auto=update
以后要改数据库配置信息也只在这个文件修改就可以了。

测试用的流程swing.jpdl.xml
<?xml version="1.0" encoding="UTF-8"?>
<process name="swing" xmlns="http://jbpm.org/4.3/jpdl">
   <start g="94,64,48,48" name="start1">
      <transition g="-52,-22" name="A" to="A"/>
   </start>
   <task assignee="A" g="73,195,92,52" name="A">
      <transition g="-52,-22" name="B" to="B"/>
   </task>
   <task assignee="B" g="266,192,92,52" name="B">
      <transition g="-40,-21" name="end" to="end1"/>
   </task>
   <end g="290,327,48,48" name="end1"/>
</process>


测试代码
public class Main {
    public static void main(String[] args)  {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        applicationContext.start();
        ProcessEngine processEngine = (ProcessEngine)applicationContext.getBean("processEngine");
        ExecutionService executionService = processEngine.getExecutionService();
        TaskService taskService = processEngine.getTaskService();

        //发布流程
        String deploymentId = processEngine.getRepositoryService().createDeployment()
        .addResourceFromClasspath("resource/swing.jpdl.xml").deploy();
        System.out.println("流程发布ID:"+deploymentId);
       
        //启动一个流程实例
        ProcessInstance processInstance = executionService.startProcessInstanceByKey("swing");
        System.out.println("流程实例ID:" + processInstance.getId());

        //A处理任务
        List<Task> taskList_A = taskService.findPersonalTasks("A");
        System.out.println("A待处理任务数:" + taskList_A.size());
        if(taskList_A.size() > 0){
            Task task = taskList_A.get(0);
            taskService.completeTask(task.getId());
        }
       
        //B处理任务
        List<Task> taskList_B = taskService.findPersonalTasks("B");
        System.out.println("B待处理任务数:" + taskList_B.size());
        if(taskList_B.size() > 0){
            Task task = taskList_B.get(0);
            taskService.completeTask(task.getId());
        }
       
    }
}

你可能感兴趣的:(spring,jbpm)