JOTM getTransactionManager().getTransaction() return null



我正在使用spring,oracle和jotm(在tomcat中)来使用2PC提交。下面是弹簧配置。

<aop:config>
    <aop:pointcut id="defaultOperation"
        expression="execution(* jatis.avantrade.foundation.model.engine.*.*(..))" />
    <aop:advisor advice-ref="defaultTrxAdvice" pointcut-ref="defaultOperation" />
</aop:config>
<tx:advice id="defaultTrxAdvice" transaction-manager="trxManager">
    <tx:attributes>
        <tx:method name="check*" read-only="true" />
        <tx:method name="get*" read-only="true" />
        <tx:method name="is*" read-only="true" />
        <tx:method name="load*" read-only="true" />
        <tx:method name="select*" read-only="true" />
        <tx:method name="count*" read-only="true" />
        <tx:method name="search*" read-only="true" />
        <tx:method name="list*" read-only="true" />
        <tx:method name="*" rollback-for="Throwable" />
    </tx:attributes>
</tx:advice>
<bean id="txImpl" class="org.springframework.transaction.jta.JotmFactoryBean" />


<bean id="trxManager"
    class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager" ref="txImpl" />
    <property name="userTransaction" ref="txImpl" />
</bean>

问题是当我使用 JOTM 对象调用getTransactionManager().getTransaction()时,它会返回 null。

Current cur = (Current) ContextHelper.getApplicationContext()
                    .getBean("txImpl");
            try {
                log.error("cur : " cur.getTransactionManager().getTransaction());
        } catch (SystemException e) {
            log.error(e.getMessage(), e);
        }

如何解决此问题?

一种方法可能是使用Apache TomEE,它是Tomcat,已经集成了TransactionManager。 编写一个简单的 Spring 工厂 bean 来交给 Spring TransactionManager 和 UserTransaction。

两者都可以从JNDI中查找:

  • java:comp/TransactionManager
  • java:comp/UserTransaction

该工厂将替换上述配置中的工厂:

<bean id="txImpl" class="org.foo.MyTransactionFactoryBean" />

不过,Spring很可能已经有一个工厂bean,用于通过这些名称查找TransactionManager。

相关内容

  • 没有找到相关文章

最新更新