淺談jBPM4與Spring整合的2種方式
如果不了解jBPM4的IOC容器,可以先看ronghao的這篇文章http://www.javaeye.com/topic/381607,是介紹jBPM4的IOC容器的。下面我們介紹jBPM與Spring整合的2種方式:
第一種:手工將SessionFactory放入jBPM4中。
第1步:更改jbpm.spring.default.cfg.xml配置文件,將下面的部分注釋掉
- <!--
- <hibernate-configuration>
- <cfgresourcecfgresource="jbpm.hibernate.cfg.xml"/>
- </hibernate-configuration>
- <hibernate-session-factory/>
- -->
注釋的部分是在jBPM4中創(chuàng)建了sessionFactory,而我們只需要一個(gè)sessionFactory。既然要將jBPM4與Spring的整合,那就希望由Spring來(lái)統(tǒng)一管理sessionFactory和事務(wù),在Spring的配置文件中構(gòu)造一個(gè)sessionFactory。ProcessEngine是jBPM4的Facade模式,一切由它與外部交互,
第2步:在Spring配置文件中寫一個(gè)bean:
- <beanidbeanid="processEngine"class="com.family168.jbpm.ProcessEngineFactoryBean">
- <propertynamepropertyname="sessionFactory"ref="sessionFactory"/>
- </bean>
第3步:在ProcessFactoryBean中注入SessionFactory:
- publicvoidsetSessionFactory(SessionFactorysessionFactory){
- this.sessionFactory=sessionFactory;
- }
第4步:在ProcessFactoryBean中創(chuàng)建一個(gè)SpringConfiguration,然后將sessionFactory放入SpringConfiguration中,再?gòu)腟pringConfiguration得到processEngine,代碼如下:
- publicvoidafterPropertiesSet(){
- SpringConfigurationcfg=newSpringConfiguration(jbpmConfigurationLocation);
- cfg.setApplicationContext(applicationContext);
- cfg.setSessionFactory(sessionFactory);
- this.processEngine=cfg.buildProcessEngine();
- }
然后我們的工作就可以開展了,可以從processEngine得到所有的service。比如:
- ProcessEngineprocessEngine=(ProcessEngine)ctx.getBean("processEngine");
- RepositoryServicerepositoryService=processEngine.getRepositoryService();
第2種:獲得Hibernate的SessionFactory。
第1步:與第一種方式的第1步一樣。
第2步:更改jbpm.tx.spring.cfg.xml配置文件:
將<standard-transaction-interceptor/>改成<spring-transaction-interceptorcurrent="true"/>然后將<transaction/><hibernate-session/>改成<hibernate-sessioncurrent="true"/>這部分修改是將jBPM4創(chuàng)建的spring事務(wù)和hibernate的session改成從當(dāng)前的ThreadLocal中獲得session和事務(wù)。
第3步:在Spring配置文件中寫bean,processEngine和template:
- <beanidbeanid="jbpmConfiguration"class="org.jbpm.pvm.internal.cfg.SpringConfiguration">
- <constructor-argvalueconstructor-argvalue="jbpm/jbpm.cfg.xml"/>
- </bean>
- <beanidbeanid="processEngine"factory-bean="jbpmConfiguration"factory-method="buildProcessEngine"/>
- <beanidbeanid="jbpmTemplate"class="com.family168.jbpm.JbpmTemplate">
- <propertynamepropertyname="processEngine"ref="processEngine"/>
- <propertynamepropertyname="dataSource"ref="dataSource"/>
- </bean>
processEngine直接使用factory-bean指向jbpmConfiguration,也就是org.jbpm.pvm.internal.cfg.SpringConfiguration,并從SpringConfiguration的buildProcessEngine中獲得。
jbpmTemplate主要是控制事務(wù),在processEngine外面創(chuàng)建事務(wù),這樣使用的時(shí)候會(huì)先調(diào)用jbpmTemplate,再調(diào)用processEngine,否則它會(huì)說(shuō)事務(wù)沒(méi)有啟動(dòng)。在jbpmTemplate中注入processEngine:
- publicvoidsetProcessEngine(ProcessEngineprocessEngine){
- this.processEngine=processEngine;
- }
這里我的理解是我們?cè)谏厦嬉呀?jīng)將事務(wù)改成從當(dāng)前的Threadlocal中獲得,所以jBPM4是必須當(dāng)前有事務(wù),如果我沒(méi)有創(chuàng)建事務(wù)的話,在使用processEngine時(shí)就會(huì)說(shuō)事務(wù)沒(méi)有啟動(dòng)。所以我們就封裝了一個(gè)jbpmTemplate,如果我的理解有誤還請(qǐng)大家指出。
第1種整合方式我會(huì)提供一個(gè)例子,第2種整合方式之后可以看我們的jBPM-Side里的控制臺(tái)。
【編輯推薦】