要知道如何將jBPM4與Spring整合,可以先了解jBPM4的IOC容器,如果不了解的可以先看ronghao的這篇文章http://www.javaeye.com/topic/381607,是介紹jBPM4的IOC容器的.下面我們介紹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> |
第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.比如:
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; } |
這裡我的理解是我們在上面已經將事務改成從當前的Threadlocal中獲得,所以jBPM4是必須當前有事務,如果我沒有創建事務的話,在使用 processEngine時就會說事務沒有啟動.所以我們就封裝了一個jbpmTemplate,如果我的理解有誤還請大家指出.
第1種整合方式的例子下載http://www.family168.com/,第2種整合方式之後可以看我們的jBPM-Side里的控制台.
[火星人 ] jBPM4與Spring整合的2種方式已經有502次圍觀