JBPM4与Spring整合的2种方式 (转)备忘
下面我们介绍jBPM与Spring整合的2种方式:
?
第一种:手工将SessionFactory放入jBPM4中。
第1步:更改jbpm.spring.default.cfg.xml配置文件,将下面的部分注释掉
<!-- ??
???<hibernate-configuration>??
?????<cfg?resource="jbpm.hibernate.cfg.xml"?/>??
???</hibernate-configuration>??
??
???<hibernate-session-factory?/>??
?-->
部分是在jBPM4中创建了sessionFactory,而我们只需要一个sessionFactory。既然要将jBPM4与Spring的整合,那就希望由Spring来统一管理sessionFactory和事务,在Spring的配置文件中构造一个sessionFactory。ProcessEngine是jBPM4的Facade模式,一切由它与外部交互。
????
第2步:在Spring配置文件中写一个bean:
<bean?id="processEngine"?class="com.family168.jbpm.ProcessEngineFactoryBean">??
????????<property?name="sessionFactory"?ref="sessionFactory"/>??
?</bean>??
<bean?id="processEngine"?class="com.family168.jbpm.ProcessEngineFactoryBean">??
????????<property?name="sessionFactory"?ref="sessionFactory"/>??
?</bean>??
第3步:在ProcessFactoryBean中注入SessionFactory:
public?void?setSessionFactory(SessionFactory?sessionFactory)?{ ??
??????this.sessionFactory?=?sessionFactory; ??
}??
第4步:在ProcessFactoryBean中创建一个SpringConfiguration,然后将sessionFactory放入SpringConfiguration中,再从SpringConfiguration得到processEngine,代码如下:?
public?void?afterPropertiesSet()?{ ??
????????SpringConfiguration?cfg?=?new??SpringConfiguration(jbpmConfigurationLocation); ??
????????cfg.setApplicationContext(applicationContext); ??
??
????????cfg.setSessionFactory(sessionFactory); ??
????????this.processEngine?=?cfg.buildProcessEngine(); ??
????}??
然后我们的工作就可以开展了,可以从processEngine得到所有的service。比如:?
?Java代码?
ProcessEngine?processEngine?=?(ProcessEngine)?ctx.getBean("processEngine");???
RepositoryService?repositoryService?=?processEngine.getRepositoryService();。
第2种:获得Hibernate的SessionFactory。
第1步:与第一种方式的第1步一样。
第2步:更改jbpm.tx.spring.cfg.xml配置文件: 将<standard-transaction-interceptor/>改成<spring-transaction-interceptor?current="true"?/>?然后将<transaction/>?????<hibernate-session/>改成<hibernate-session?current="true"/>??这部分修改是将jBPM4创建的spring事务和hibernate的session改成从当前的ThreadLocal中获得session和事务。
第3步:在Spring配置文件中写bean,processEngine和template:<bean?id="jbpmConfiguration"?class="org.jbpm.pvm.internal.cfg.SpringConfiguration">??????????<constructor-arg?value="jbpm/jbpm.cfg.xml"?/>??????</bean>????????<bean?id="processEngine"?factory-bean="jbpmConfiguration"?factory-method="buildProcessEngine"?/>????????<bean?id="jbpmTemplate"?class="com.family168.jbpm.JbpmTemplate">??????????<property?name="processEngine"?ref="processEngine"/>??????????<property?name="dataSource"?ref="dataSource"/>??????</bean>?processEngine直接使用factory-bean指向jbpmConfiguration,也就是org.jbpm.pvm.internal.cfg.SpringConfiguration,并从SpringConfiguration的buildProcessEngine中获得。 jbpmTemplate主要是控制事务,在processEngine外面创建事务,这样使用的时候会先调用jbpmTemplate,再调用processEngine,否则它会说事务没有启动。在jbpmTemplate中注入processEngine: public?void?setProcessEngine(ProcessEngine?processEngine)?{ ??????????this.processEngine?=?processEngine; ??????}
public void setProcessEngine(ProcessEngine processEngine) { this.processEngine = processEngine; }这里在上面已经将事务改成从当前的Threadlocal中获得,所以jBPM4是必须当前有事务,如果没有创建事务的话