春天JTA事务管理器配置:支持Tomcat和JBoss的(Spring JTA Transactio

2019-07-30 18:06发布

我使用JPA和JTA与Spring Web应用程序。 我想同时支持JBoss和Tomcat的。 当运行在JBoss上,我想使用JBoss自己的事务管理器,并在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获取“事务管理”:

<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>

有没有使相应的事务管理器来配置此方式 - 的JBoss或JOTM - 使用,而不需要两个不同的配置文件?

Answer 1:

我想你已经错过了JNDI点。 JNDI是非常写入解决您的问题!

我想,你可以把它升了一级,所以不是使用“UserTransaction的”或“从JNDI transactionManager的”根据您的情况。 为什么不添加“的JtaTransactionManager”到JNDI。 您配置推送到它应该是,而不是建立更配置文件的JNDI这样[像没有足够已;)]。



Answer 2:

您可以使用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作为系统属性

这是一个可行的方法。 看到我的博客更完整的例子。

希望这可以帮助。



Answer 3:

如果您在使用Spring 2.5可以使用<TX:JTA事务经理/>。 我还没有与JBoss使用它,但它应根据节为您工作9.8应用服务器专用的集成从Spring参考手册。



Answer 4:

<tx:jta-transaction-manager/>办法将寻找一个事务管理器中的几个默认位置在这里列出 。 如果你的JBoss事务管理器是不是在这些地点之一,我建议你移动它,如果可能的话,或将在Tomcat中,使两个容器有他们在同一个JNDI位置TM。



Answer 5:

刚刚加入我的经验,在这里,所以我不必再重新受害的经历。

作为bmatthews68,Chochos和这些海报说,使用<tx:jta-transaction-manager/>在Spring Bean文件; 它肯定提供了一个抽象的适当水平,而且也没有必要做任何事情在弹簧侧多余的。

至于Tomcat的,我声明<Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60" />在缺省/共享conf/context.xml文件,其结合java:comp/UserTransaction 。 由于这是由Spring搜索的地方之一,你应该不需要做任何事情。

有一个问题是:如果你像我一样使用Maven,请确保您排除在任何依赖javax.transaction:jta罐子或设置范围provided 。 否则,你将体验类加载器的问题。



文章来源: Spring JTA TransactionManager config: Supporting both Tomcat and JBoss