如何用Spring进行JBPM的事务管理
|
yellow08
2007-12-25
小弟最近做JBPM项目,使用的SPRING+JBPM,由于对事务这些理解不够,现在使用Spring的TransactionProxyFactoryBean来管理JBPM操作的事务,发现JbpmContext.save(ProcessInstance ProcessInstance )都不能实现了,希望大家能指点一下:如果使用Spring进行事务管理,究竟应该怎么配置 Jbpm.CFG.xml 或者其他的文件。
下面是一些配置文件: 相关的ApplicationContext.xml设置
<bean id="baseTxService" lazy-init="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="jbpmConfiguration"
class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean">
<property name="sessionFactory" ref="sessionFactory"></property>
<property name="configuration"
value="classpath:org/jbpm/default.jbpm.cfg.xml" />
<property name="createSchema" value="false" />
</bean>
<!-- JBPM 的Template -->
<bean id="jbpmTemplate"
class="org.springmodules.workflow.jbpm31.JbpmTemplate">
<constructor-arg index="0" ref="jbpmConfiguration" />
</bean>
<bean id="process_task_Service" parent="baseTxService">
<property name="target" ref="Process_Task_ServiceTarget"></property>
</bean>
<bean id="Process_Task_ServiceTarget"
class="com.workflow.model.service.impl.ProcessOrTaskServiceImpl">
<property name="processOrTaskDao">
<ref bean="processOrTaskDao" />
</property>
</bean>
<bean name="processOrTaskDao"
class="com.workflow.model.hibernateDaoImpl.ProcessOrTaskDaoImpl">
<property name="jbpmTemplate">
<ref bean="jbpmTemplate" />
</property>
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
default.jbpm.cfg.xml的设置
<jbpm-configuration>
<jbpm-context>
<!--主要就是persistenceservice的改变 其他不变-->
<service name="persistence">
<factory>
<bean
class="org.jbpm.persistence.db.DbPersistenceServiceFactory">
<field name="isTransactionEnabled">
<false />
</field>
<field name="isCurrentSessionEnabled">
<true/>
</field>
</bean>
</factory>
</service>
</jbpm-configuration>
以下是Dao的代码:很简单 就是保存ProcessInstance:
public class ProcessOrTaskDaoImpl extends JbpmDaoSupport implements
ProcessOrTaskDao {
public ProcessInstance saveProcessInstance(final long processDefinitionID) {
return (ProcessInstance) this.getJbpmTemplate().execute(
new JbpmCallback() {
public Object doInJbpm(JbpmContext context) {
ProcessDefinition processDefinition = context.getGraphSession().loadProcessDefinition(processDefinitionID);
ProcessInstance processInstance = new ProcessInstance(processDefinition);
context.save(processInstance);
return processInstance;
}
});
}}
|
|
|
yellow08
2007-12-25
用JUNIT直接保存的话 ,可以后台看到事务提交 不过使用SPRING的话 看不到事务提交, 因为查询可以实现,估计就是事务的问题,请大家多多帮忙 。。。。。
|
|
|
betafox
2007-12-26
你好,收到你的短信了,你的配置方式的主要问题在于:jbpm使用的hibernate session并没有纳入spring的管理范围,spring的事务管理器无法对其发生作用;同时你设置jbpm自己不管理事务,所以造成jbpm的session事务无法提交。
请参照 http://betafox.javaeye.com/admin/show/144336 上的详细配置方式,要点是整合jbpm的hibernate.cfg.xml; |

