如何用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;