Spring+Atomikos实现JTA事务

一、环境
AtomikosTransactionsEssentials-3.7.2
下载地址:http://www.atomikos.com/Main/InstallingTransactionsEssentials
jar包引入
[quote]
transactions-jdbc.jar(必须包)
transactions-jta.jar
transactions.jar
atomikos-util.jar
transactions-api.jar
[/quote]
拷贝
AtomikosTransactionsEssentials-3.7.2\examples\spring\jdbc
下面的
jta.properties 到项目工程classpath根目录下(src下)

二 . spring 配置修改
参考 AtomikosTransactionsEssentials-3.7.2\examples\spring\jdbc
的config.xml

有一个主意点: JtaTransactionManager

 <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<ref bean="atomikosTransactionManager" />
</property>
<property name="userTransaction">
<ref bean="atomikosUserTransaction" />
</property>
<property name="allowCustomIsolationLevels" value="true"/>
<!-必须设置,否则程序出现异常 JtaTransactionManager does not support custom isolation levels by default -->
</bean>


另外:
3.7.2已经没有SimpleDataSource这个类了
加了个AtomikosDataSourceBean这个类

关于这个问题的解决:
每当我启动tomcat时,控制台就平凡打印如下警告,不影响系统运行。
http://www.iteye.com/problems/64330
[quote]
WARN atomikos:107 - Local heuristic termination of coordinator com.atomikos.spring.jdbc.tm0050000015 with state HEUR_HAZARD
2011/04/29 13:55:45724 WARN atomikos:107 - Local heuristic termination of coordinator com.atomikos.spring.jdbc.tm0050000015 with state HEUR_HAZARD
2011/04/29 13:55:45878 WARN atomikos:107 - Local heuristic termination of coordinator com.atomikos.spring.jdbc.tm0050000015 with state HEUR_HAZARD
2011/04/29 13:55:4630 WARN atomikos:107 - Local heuristic termination of coordinator com.atomikos.spring.jdbc.tm0050000015 with state HEUR_HAZARD
[/quote]
修改jta.properties文件 应该是关掉日志

com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
com.atomikos.icatch.automatic_resource_registration = true
com.atomikos.icatch.enable_logging = false



关于JBPM 报的多个sessionFactory警告的处理
参考:http://hi.baidu.com/btb368/blog/item/bc419c51e1b8007b8435246a.html
[quote]
Multiple Spring beans found for type interface org.hibernate.SessionFactory returning the first one
2011-07-05 11:08
在OECP平台中,我们支持多数据源的配置,以支持对平台数据库和业务组件数据库的操作,但是在将jbpm4.4整合进来做工作流引擎的时候,却出现了问题。

采用官方的解决方案,在单数据源下没有问题,但是在多数据源下,我们采用jotm的jta事务,当在一个事务之内既有操作平台的服务,又有操作jbpm的服务时,控制台上打印一下警告和错误。更为奇怪的是,如果在一个事务里先执行jbpm的数据库操作,在执行其他的数据操作,没有问题,反过来却不行,一头雾水啊。难道jbpm搞不清楚是哪个sessionfactory了。经过Google和长时间的分析,解决了该问题,现把方案分享一下。

问题:
Multiple Spring beans found for type interface org.hibernate.SessionFactory returning the first one found
java.sql.SQLException: Cannot get connection for URL jdbc:oracle:thin ** 调用中无效的参数

一、扩展SpringHelper,添加setSessionFactory,指定sessionfactory注入

package com.abc.onewaveinc.core.common;

import org.hibernate.SessionFactory;
import org.jbpm.api.ProcessEngine;
import org.jbpm.pvm.internal.cfg.ConfigurationImpl;
import org.jbpm.pvm.internal.processengine.SpringHelper;

public class ProcessEngineFactoryBean extends SpringHelper {

private SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

public SessionFactory getSessionFactory() {
return sessionFactory;
}

public ProcessEngine createProcessEngine() {
ProcessEngine processEngine = new ConfigurationImpl().springInitiated(
applicationContext).setResource(jbpmCfg)
.setHibernateSessionFactory(sessionFactory)
.buildProcessEngine();
return processEngine;
}

}

<!-- jbpm配置 cn.oecp.jbpm4.cfg.pvm.ProcessEngineFactoryBean上面已经定义-->

<bean id="springHelper" class="com.onewaveinc.core.common.ProcessEngineFactoryBean" >
<property name="jbpmCfg">
<value>jbpm.cfg.xml</value>
</property>
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>

二、其他配置省略,修改了jbpm.tx.spring.cfg.xml中spring事务拦截方式,这一步很关键,保证在一个事务管理器内



<?xml version="1.0" encoding="UTF-8"?>

<jbpm-configuration spring="enabled">

<process-engine-context>

<command-service name="newTxRequiredCommandService">
<retry-interceptor />
<environment-interceptor policy="requiresNew" />
<spring-transaction-interceptor
policy="requiresNew" transaction-manager="hibernateTransactionManager"/>
</command-service>

<!-- Default command service has a Spring transaction interceptor-->
<command-service name="txRequiredCommandService">
<retry-interceptor />
<environment-interceptor policy="requiresNew"/>
<spring-transaction-interceptor
current="hibernateTransactionManager" />
</command-service>

</process-engine-context>

<transaction-context>
<transaction type="spring" />
<repository-session></repository-session>
<hibernate-session current="true"/>
</transaction-context>

</jbpm-configuration>

http://www.oecp.cn/hi/yongtree/blog/2562
[/quote]

参考文档:
Spring+iBatis+Atomikos实现JTA事务
http://www.chineselinuxuniversity.net/articles/39426.shtml
spring+atomikos+JTA完整例子
http://www.cnblogs.com/huangjingzhou/articles/2012011.html
Spring JTA应用JOTM & Atomikos III Atomikos
http://tom-duan.iteye.com/blog/147599
JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)
http://kb.cnblogs.com/a/2012014/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值