10

我有一个使用 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 - 而无需两个不同的配置文件?

4

5 回答 5

14

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

我认为您可以将其提升一个级别,因此根据您的情况,而不是使用“userTransaction”或“来自 JNDI 的 transactionManager”。为什么不将“JtaTransactionManager”添加到 JNDI。这样你就可以将配置推送到它应该在的 JNDI 中,而不是创建更多的配置文件 [ 好像还不够 ;) ]。

于 2009-01-06T15:33:51.070 回答
4

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

例如,如果您将 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作为系统属性

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

希望这可以帮助。

于 2008-09-22T21:51:16.610 回答
2

如果您使用的是 Spring 2.5,则可以使用 <tx:jta-transaction-manager/>。我没有将它与 JBoss 一起使用,但根据Spring 参考手册中的第9.8 节应用程序服务器特定的集成,它应该适合你。

于 2008-09-22T22:08:31.127 回答
2

该方法将在此处列出<tx:jta-transaction-manager/>的几个默认位置查找事务管理器。如果您的 JBoss 事务管理器不在这些位置之一,我建议您尽可能移动它,或者将它移动到 Tomcat 中,以便两个容器的 TM 位于相同的 JNDI 位置。

于 2008-11-04T19:40:26.940 回答
1

只需在这里添加我的经验,这样我就不必再次遭受这种体验了。

正如 bmatthews68、Chochos 和这些海报所说,<tx:jta-transaction-manager/>在你的 Spring bean 文件中使用;它确实提供了适当的抽象级别,并且不需要在 Spring 方面做任何额外的事情。

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

不过有个问题:如果像我一样使用 Maven,请确保排除对javax.transaction:jtajar 的任何依赖项或将范围设置为provided. 否则,您将遇到类加载器问题。

于 2011-02-22T16:16:50.133 回答