查阅 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();
}
}