Spring JTA TransactionManager config:支持Tomcat和JBoss

时间:2008-09-22 21:27:26

标签: java spring jboss jta jotm

我有一个使用JPA和JTA与Spring的Web应用程序。我想支持JBoss和Tomcat。在JBoss上运行时,我想使用JBoss自己的TransactionManager,当在Tomcat上运行时,我想使用JOTM。

我有两种情况都可以工作,但我现在发现我似乎需要为这两种情况分别使用两种Spring配置。使用JOTM,我需要使用Spring的JotmFactoryBean

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

但是在JBoss中,我只需要从JNDI获取“TransactionManager”:

<bean id="transactionManager" 
 class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager">
        <bean class="org.springframework.jndi.JndiObjectFactoryBean">
             <property name="resourceRef" value="true" />
             <property name="jndiName" value="TransactionManager" />
             <property name="expectedType" 
               value="javax.transaction.TransactionManager" />
        </bean>
    </property>
</bean>

有没有办法配置它,以便使用适当的TransactionManager - JBoss或JOTM - 而不需要两个不同的配置文件?

5 个答案:

答案 0 :(得分:14)

我认为你错过了JNDI的观点。 JNDI几乎是为了解决你遇到的问题而编写的!

我认为你可以把它提升一个级别,而不是根据你的情况使用“userTransaction”或“来自JNDI的transactionManager”。为什么不将“JtaTransactionManager”添加到JNDI。这样你就可以将配置推送到JNDI所在的位置,而不是创建更多的配置文件[比如已经不够了;]。

答案 1 :(得分:4)

您可以使用PropertyConfigurerPlaceholder注入bean引用以及简单值。

例如,如果你打电话给你的豆子'jotm'和'jboss'那么你可以注入你的TM:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE">
    <property name="location" value="classpath:/path/to/application.properties"/>
</bean>
<bean id="jotm">...</bean>
<bean id="jboss">...</bean>
<bean id="bean-requiring-transaction-manager">
    <property name="transactionManager" ref="${transaction.strategy}"/>
</bean>

然后您可以使用

交换事务管理器
  • 在属性文件中的transaction.strategy = jotm
  • -Dtransaction.strategy = jotm 作为系统属性

这是一种可行的方法。有关更完整的示例,请参阅我的blog

希望这有帮助。

答案 2 :(得分:2)

如果您使用的是Spring 2.5,则可以使用&lt; tx:jta-transaction-manager /&gt;。我没有将它与JBoss一起使用,但它应该适用于你,根据Spring参考手册中的9.8 Application server-specific integration部分。

答案 3 :(得分:2)

<tx:jta-transaction-manager/>方法将在多个默认位置listed here中查找事务管理器。如果你的JBoss事务管理器不在其中一个位置,我建议你移动它,如果可能的话,或者在Tomcat中移动它,这样两个容器的TM都在同一个JNDI位置。

答案 4 :(得分:1)

只是在这里添加我的经验,所以我不必再次重新体验这种体验。

正如bmatthews68,Chochos和these posters所说,在你的Spring bean文件中使用<tx:jta-transaction-manager/>;它绝对提供了适当的抽象级别,并且没有必要在Spring方面做任何额外的事情。

对于Tomcat,我在默认/共享<Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" />文件中声明conf/context.xml,该文件绑定到java:comp/UserTransaction。由于这是Spring搜索的地方之一,您不需要做任何其他事情。

但有一点需要注意:如果像我一样使用Maven,请确保排除javax.transaction:jta jar上的任何依赖项或将范围设置为provided。否则您将遇到类加载器问题。