整合SPRING與JBPM核心就是需要將JBPM的BEAN由SPRING來(lái)管理利用IOC來(lái)展現(xiàn)SPRING框架的優(yōu)勢(shì)!
這2天在研究怎樣整合兩者!在整合過(guò)程中也出現(xiàn)了不少意想不到的問(wèn)題!在這里記錄下來(lái)希望可以未對(duì)此感興趣的朋友提供些幫助!
SPRING+JBPM
1)下載SPRING-JBPM MODULE
這個(gè)模塊是SPRING支持JBPM使用的必要模塊!現(xiàn)在還沒(méi)有放入SPRING的發(fā)行版本中!不過(guò)通過(guò)她基本可以實(shí)現(xiàn)了對(duì)JBPM的操作!代碼需要從SPRING的CVS下載
地址是:pserver:anonymous@cvs.sourceforge.net:/cvsroot/springframework
從中獲取SPRING-JBPM MODULE即可.
2)SPRING加載JBPM資源
SPRING-CONFIG.XML(部分)
數(shù)據(jù)源
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean" destroy-method="close">
<property name="jndiName" value="jdbc/jbpm"/>
</bean>
HIBERNATE SESSION FACTORY
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
注意這里由于我使用的JBPM是以JAR的形式存在于CLASSPATH中的所以當(dāng)加載其中的HIBERNATE實(shí)體描述文件的時(shí)候需要使用下面的寫(xiě)法
<property name="mappingJarLocations">
<list>
<value>WEB-INF/lib/jbpm-3.0.1.jar</value>
<value>WEB-INF/lib/jbpm-identity-3.0.1.jar</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
為了使HIBERNATE3查詢的時(shí)候使用正確的語(yǔ)法需要指明查詢工廠類(lèi),如果不指定回出現(xiàn)
ClassNotFoundException: org.hibernate.hql.ast.HqlToken 的錯(cuò)誤!
<prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
下面紅色的部分是SPRING管理JBPM的必要配置!里面的JBPMTEMPLATE是很重要的類(lèi)
SPRING中使用JBPM基本都是通過(guò)她來(lái)完成的!
<bean id="hibernateConfiguration" factory-bean="&sessionFactory" factory-method="getConfiguration"/>
<bean id="jbpmSessionFactory" class="org.springframework.workflow.jbpm.LocalJbpmSessionFactoryBean">
<property name="hibernateSessionFactory" ref="sessionFactory"/>
<property name="hibernateConfiguration" ref="hibernateConfiguration"/>
</bean>
<bean id="jbpmTemplate" class="org.springframework.workflow.jbpm.JbpmTemplate">
<property name="jbpmSessionFactory" ref="jbpmSessionFactory"/>
</bean>
這是JBPM的管理既納入到了SPRING中!
3)使用SPRING操作JBPM
在我們的類(lèi)中需要調(diào)用JBPM的功能時(shí)我們只需要將JBPMTEMPATE類(lèi)注入到我們的類(lèi)中
在jbpmTemplate中實(shí)現(xiàn)了不多的幾個(gè)方法,有很多JBPM的方法沒(méi)有實(shí)現(xiàn)不過(guò)沒(méi)關(guān)系我們可以使用SPRING中最常見(jiàn)的CALLBACK機(jī)制來(lái)實(shí)現(xiàn)我們的需要,下面舉出幾個(gè)例子:
A)保存流程定義方法
利用SPRING將jbpmTemplate注入進(jìn)我們的類(lèi)中
private JbpmTemplate jbpmTemplate = null;
public void setJbpmTemplate(JbpmTemplate jbpmTemplate) {
this.jbpmTemplate = jbpmTemplate;
}
/**
* 保存流程定義
* @param xmlStr 流程定義的JPDL的XML字符串形式
*/
public void saveWorkFlowDefinition(String xmlStr){
log.debug("saveWorkFlowDefinition start");
final ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(xmlStr);
//call spring jbpm call back for save processdefinition
jbpmTemplate.execute(new JbpmCallback(){
public Object doInJbpm(JbpmSession jbpmSession){
jbpmSession.beginTransaction();
GraphSession gSession = jbpmSession.getGraphSession();
gSession.saveProcessDefinition(processDefinition);
jbpmSession.commitTransaction();//這里我們只需要提交事物即可!關(guān)閉SESSION的工作JBPMTEMPLATE回幫助我們完成!
return processDefinition;
}});
log.debug("saveWorkFlowDefinition end");
}
B)取得所有的流程定義:
/**
* 取得所有的工作流定義
* @return 工作流定義列表
*/
public List getAllWorkFlow(){
log.debug("getAllWorkFlow start");
List list = (List)jbpmTemplate.execute(new JbpmCallback(){
public Object doInJbpm(JbpmSession jbpmSession){
GraphSession graphSession = jbpmSession.getGraphSession();
log.debug("getAllWorkFlow end");
List tempList = graphSession.findAllProcessDefinitions();
return tempList;
}});
log.debug("getAllWorkFlow end");
return list;
}
聯(lián)系客服