代码之家  ›  专栏  ›  技术社区  ›  Henning

Spring JTA TransactionManager配置:同时支持Tomcat和JBoss

  •  10
  • Henning  · 技术社区  · 16 年前

    我有一个使用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 回复  |  直到 16 年前
        1
  •  14
  •   David Newcomb    16 年前

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

        2
  •  4
  •   toolkit    16 年前

    您可以使用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 在属性文件中
    • 作为系统属性

    blog 有关更完整的示例。

        3
  •  2
  •   Brian Matthews    16 年前

    如果您使用的是Spring 2.5,则可以使用<tx:jta事务管理器/>。我没有在JBoss中使用过它,但根据第节,它应该适合您 9.8 Application server-specific integration 来自弹簧参考手册。

        4
  •  2
  •   Chochos    16 年前

    这个 <tx:jta-transaction-manager/> 该方法将在几个默认位置寻找事务管理器 listed here

        5
  •  1
  •   Community CDub    8 年前

    只是在这里加上我的经历,这样我就不必再忍受这种经历了。

    正如Bmatthews 68,Chochos和 these posters 说过,用 <tx:jta-transaction-manager/>

    至于雄猫,我宣布 <Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" /> 在默认/共享模式下 conf/context.xml 文件,该文件绑定到 java:comp/UserTransaction . 因为这是Spring搜索的地方之一,所以您不需要做任何其他事情。

    不过有一个问题:如果像我一样使用Maven,请确保排除对 javax.transaction:jta jar或将作用域设置为 provided . 否则您将遇到类加载器问题。