近期,由於項目要求,需要使用工作流框架,開發基於工作流的業務模塊。經過一翻考察,最終還是決定使用jbpm4.4。盡管此時jbpm5.1已經發布,但相對與jbpm4改動太大、資料甚少。且jbpm之父Tom Baeyens已經出走jboss,去了另一家公司,在jbpm4的基礎上開發了一個叫activiti5的工作流框架。因此,以後要想升級,也可往activiti發展。
由於是在原有系統上集成jbpm4.4,這就要求盡量不要打破原系統的生態規則。能達到對修改封閉,對擴展開放,那是最理想的狀態。雖然不能做到完全封閉,但我一直是基於這個原則做的集成,盡量少修改。
JBPM4.4部署在Tomcat6以上的版本jar包沖突 http://www.linuxidc.com/Linux/2014-04/99476.htm
下面讓我們來正式開工吧!
首先介紹一下原系統使用的技術:struts1.2.9+spring2.5.6+hibernate3.2.5+tomcat5.5+Oracle10g
struts的action使用spring的Ioc容器管理。hibernate的sessionFactory也是放在Ioc容器裡,且使用AnnotationSessionFactoryBean創建。對象關系基於annotation的方式映射。介紹到此,大家應該大概了解了原系統的開發環境。該環境已在客戶那裡正式運行生產,現在就是要在該環境中,集成jbpm4.4。
集成步驟
1.到官網下載jbpm-4.4.zip。
2.將jbpm4.4必須包導入項目中。如果懶就將全部包導入項目,但不推薦這麼做,因為會有很多重復包,可能會造成一些莫明其妙的問題。至於哪些是必需包,可以參考:http://yuanlg.iteye.com/blog/1114842
另由於jbpm4內部使用hibernate做的持久化,而hibernate所需的包,在原系統已經導入,所以hibernate依賴的包,就不用導入了。
3.眾所周知,對jbpm4的操作,都需要由ProcessEngine這個類做為入口。因此,得到這個類,就能直接訪問jbpm4提供的各種服務。我們將jbpm4集成到spring,也是拿這個類做為入口。只要能得到這個類的bean對象,集成就算成功了。幸好,jbpm4.4已提供了集成到spring的方案。網上有很多集成方案有一些是自己寫的,有一些是jbpm4早期版本提供的。到4.3版本,官方提供的是使用SpringHelper來做集成。
只要將以下bean配制放到applicationContext.xml裡,就算是集成完成了。
<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper">
<property name="jbpmCfg" value="spring.jbpm.cfg.xml"></property>
</bean>
<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine"/>
上面的spring.jbpm.cfg.xml可以將\jbpm-4.4\install\src\cfg\jbpm\spring.jbpm.cfg.xml復制到項目的src目錄下。
細心的人可能會打開spring.jbpm.cfg.xml這個文件看看,發現裡面有以下配制,甚是疑問!!!
<string name="spring.cfg" value="applicationContext.xml" />
我當初也不懂這是什麼意思,後面根蹤源代碼才發現,這個配制完全可以刪除。於是我將它刪除了。當然,你也可以不用刪,完全沒影響。
以下是使用這個配制的源代碼,貼同來,供參考!
if (configuration.isInstantiatedFromSpring()) {
applicationContext = (ApplicationContext) configuration.getApplicationContext();
//(略)……
} else {
String springCfg = (String) configuration.getProcessEngineWireContext().get("spring.cfg");
if (springCfg==null) {
springCfg = "applicationContext.xml";
}
applicationContext = new ClassPathXmlApplicationContext(springCfg);
springProcessEngine = (SpringProcessEngine) applicationContext.getBean("processEngine");
}
意思是:當我們直接new SpringHelper對象,並調用createProcessEngine()方法時,它會找到applicationContext.xml來初始化一個applicationContext。
而如果將SpringHelper交給spring Ioc容器創建時,它就不需要自已去初始化applicationContext,因為SpringHelper實現了ApplicationContextAware接口,spring會自動將applicationContext對象注入進來。
在這裡,我們肯定是將SpringHelper交給spring Ioc容器創建。所以spring.cfg這個配制根本用不上。
4.初始化數據庫。
在\jbpm-4.4\install\src\db\create目錄下,有相應數據庫的sql腳本。找到適合你的腳本,執行,初始化數據庫便成功了。
不可否認,這裡提供的sql腳本的確有點少。連DB2、sql server的都沒有提供。
5.配制jbpm4的對象關系映射
jbpm4使用hibernate做持久化,而hibernate在原系統中已與spring集成好。因此,只需要將jbpm4的hbm文件加入sessionFactory bean配制中就可以了。將以下配制加入sessionFactory bean中。
<property name="mappingLocations">
<list>
<value>classpath:jbpm.execution.hbm.xml</value>
<value>classpath:jbpm.history.hbm.xml</value>
<value>classpath:jbpm.identity.hbm.xml</value>
<value>classpath:jbpm.repository.hbm.xml</value>
<value>classpath:jbpm.task.hbm.xml</value>
</list>
</property>
這些jbpm.*.hbm.xml文件,在jbpm.jar裡面。因此,加上classpath前綴,強制從類路徑裡查找資源。
至此,大功告成,集成完畢。
現在,該怎麼使用呢?很簡單,在你需要使用jbpm4的類裡,聲明一個processEngine屬性,並寫上相應的setter/getter方法。在spring bean配制文件裡,將processEngine對象注入進來,便可以使用jbpm4提供的各種服務了。
在實際項目中,我還加入了以下配制,當需要哪個服務時,便注入哪個服務對象。這樣也算是解藕吧!呵呵……
<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
<bean id="executionService" factory-bean="processEngine" factory-method="getExecutionService"/>
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
<bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>
謹以此文獻給正在摸索如何將jbpm4.4集成到spring的同行開發者們。
JBPM 的詳細介紹:請點這裡
JBPM 的下載地址:請點這裡