【问题标题】:How do I access TomEE's JTA transaction manager?如何访问 TomEE 的 JTA 事务管理器?
【发布时间】:2013-07-04 04:01:46
【问题描述】:

我有一个使用 Spring 的声明式事务管理的应用程序。如何在 TomEE+ 容器中部署它,以便应用程序使用 TomEE 的 JTA 事务管理器?

更具体地说,如何从 Spring 的“application-context.xml”文件中引用内置事务管理器?

Spring 的事务管理配置似乎想通过 bean 引用或 JNDI 查找来查找事务管理器;我花了一天时间研究这个并查看源代码;我发现了很多关于这个问题的讨论(下面的参考资料),但没有明确的方法。

我在应用程序的 META-INF/persistence.xml 中的内容是这样的:

<persistence-unit name="myPersistenceUnit" transaction-type="JTA">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
    <jta-data-source>myDs-managed</jta-data-source>
    <non-jta-data-source>myDs-unmanaged</non-jta-data-source>
    <properties>
        <property name="openjpa.jdbc.DBDictionary" 
            value="org.apache.openjpa.jdbc.sql.PostgresDictionary"/>       
        <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/>
        <property name="openjpa.Run
        <property name="openjpa.Log" value="slf4j" />
    </properties>
</persistence-unit>

而且,在应用程序 META-INF/spring/applicationContext.xml 文件中,我有这个:(我已经尝试了各种不同的 transactionManagerName 值,正如该主题的各种讨论中所建议的那样,因为它似乎在应用程序服务器中是非标准的

<tx:annotation-driven mode="aspectj" transaction-manager="txManager" />
<bean class="org.springframework.transaction.jta.JtaTransactionManager"
        id="txManager">
        <property name="transactionManagerName" 
                       value=" java:comp/TransactionManager"/>
</bean>

这是一个声称适用于 JBoss 的示例:Spring JTA configuration - how to set TransactionManager?

这是一个在 xml 配置文件中不起作用的险兆:https://issues.apache.org/jira/browse/TOMEE-38

如果您掌握了 initialContext,以下是如何在 java 代码中执行此操作:http://osdir.com/ml/users.openejb.apache.org/2012-11/msg00110.html

[编辑:Tomee 文档讨论了如何声明事务管理器,但它说在 Tomee.xml 中进行,它属于服务器而不是单个 webapp;我想为单个应用程序而不是为整个服务器配置事务管理器:http://tomee.apache.org/containers-and-resources.html]

【问题讨论】:

  • JTA默认提供的事务管理器的类名是什么?我注意到 TomEE+ 发行版包括 geronimo-transaction 和 openejb-core,两者都有相当多的事务管道。

标签: spring jta openejb apache-tomee


【解决方案1】:

您是否尝试过 java:comp/env/TransactionManager 的 transactionManagerName? , 您是否还按照此处所述声明了 TransactionManager 和 DataSource:http://tomee.apache.org/containers-and-resources.html?

【讨论】:

  • Jukka,谢谢,是的,我试过 java:comp/env/TransactionManager。我查看了您引用的文档页面,但它谈到了在 tomee.xml 中声明数据源和事务管理器,据我了解,它为所有应用程序配置了整个服务器实例;我只想为单个应用程序配置数据源和事务管理器。 (编辑问题以澄清这一点)
  • Spring 不会为您创建底层容器管理的事务管理器或数据源,因此您需要在 tomee.xml(或其他一些特定于容器的配置文件)中声明它们。我不知道 TomEE 是否允许您将其范围限制为单个应用程序。
  • 但是如果你真的需要,你可以在你的 spring 配置中将 TomEE 事务管理器和数据源声明为 bean。但就我个人而言,我只会让容器管理它们,而不用担心细节。
  • Jukka,“让容器管理它们,不用担心细节”正是我想要完成的。你能帮我做吗?
  • 结果比预想的要容易:&lt;bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"&gt; &lt;property name="transactionManagerName" value="java:comp/env/comp/TransactionManager"/&gt; &lt;/bean&gt;
猜你喜欢
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 2020-12-07
  • 2011-12-10
  • 2020-10-25
  • 1970-01-01
  • 2012-07-01
相关资源
最近更新 更多