`

Spring+Atomikos实现JTA事务

 
阅读更多
一、环境
AtomikosTransactionsEssentials-3.7.2
下载地址:http://www.atomikos.com/Main/InstallingTransactionsEssentials
jar包引入
引用

transactions-jdbc.jar(必须包)
transactions-jta.jar
transactions.jar
atomikos-util.jar
transactions-api.jar

拷贝
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
引用

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 

修改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
引用

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


参考文档:
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/
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics