jbpm4.3 spring 整合

来源:互联网 发布:陈意涵长相知乎 编辑:程序博客网 时间:2024/04/28 20:26

查阅 jBPM Developers Guide 文档

集成Spring和jBPM的最简单方式是在你的jbpm.cfg.xml文件中导入 jbpm.tx.spring.cfg.xml

<import resource="jbpm.tx.spring.cfg.xml" />    

这个配置使用了一个事务管理器,它是定义在Spring配置中的。 从这个文件的内容开始吧,如果你需要了解jBPM-spring 的整合配置。

如果你是从一个已存在的配置开始,可以把standard-transaction-interceptor 替换为spring-transaction-interceptor。hibernate session需要使用属性current="true", 这取决于是否使用了spring中的'current session'策略。 而且,<transaction/>必须从transaction-context中删除,如果你希望 事务只由spring进行管理。 这会让jBPM从当前session中搜索,它应该是被spring提供的。

    <process-engine-context>        <command-service>          <spring-transaction-interceptor />          ...        </command-service>        ...    </process-engine-context>    <transaction-context>        ...        <hibernate-session current="true"/>    </transaction-context>        

spring-transaction-interceptor默认会查找PlatformTransactionManager的实现, 通过类型在定义好的bean中查找。在有多个事务管理器的情况, 可以使用事务管理器的名称来指定使用哪一个, 可以这样使用拦截器:

<spring-transaction-interceptor transaction-manager="myTransactionManager" />  

Spring集成提供了一个特殊的context,它会添加到context集合中, jBPM引擎会从中查找bean。 使用SpringContext,现在可以从Spring Application Context中获得bean。 jBPM流程引擎可以向下面这样配置在 spring的applicationContext.xml中:

<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper" />
    <bean id="processEngine" factory-bean="springHelper"

        factory-method="createProcessEngine" />

采用此种方式不建议这样获得服务

<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />

<bean id="executionService" factory-bean="processEngine" factory-method="getExecutionService" />

在创建repositoryService对象的时候createBean() 方法会循环调用repositoryService对象,出现循环调用。


可以这样延迟实例化Bean,但意义不大。

<bean id="repositoryService" factory-bean="processEngine"
        factory-method="getRepositoryService"
        depends-on="springHelper,processEngine" lazy-init="true"/>

org.jbpm.pvm.internal.processengine.SpringHelper 的代码

package org.jbpm.pvm.internal.processengine;import org.jbpm.api.ProcessEngine;import org.jbpm.pvm.internal.cfg.ConfigurationImpl;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;/** * @author Joram Barrez */public class SpringHelper implements ApplicationContextAware {    protected ApplicationContext applicationContext;  protected String jbpmCfg = "jbpm.cfg.xml";  public void setJbpmCfg(String jbpmCfg) {    this.jbpmCfg = jbpmCfg;  }  //获得Spring容器 ApplicationContext 拿到Spring的事物管理器,实际上是Hibernate的事物管理器  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {    this.applicationContext = applicationContext;  }    protected ProcessEngine createProcessEngine() {    return new ConfigurationImpl()      .springInitiated(applicationContext)      .setResource(jbpmCfg)      .buildProcessEngine();  }  }


原创粉丝点击