2008-09-22 157 views
10

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

我有两种方案的工作,但我现在发现,我似乎需要两种情况下两个单独的弹簧配置。随着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> 

有没有配置该让的方式适当的TransactionManager - JBoss或JOTM - 被使用,而不需要两个不同的配置文件?

+0

Spring 3不再提供`org.springframework.transaction.jta.JotmFactoryBean`类,因此您可能需要从2.5.x复制源代码。 – Jason 2014-01-08 01:13:26

回答

14

我想你已经错过了JNDI的要点。 JNDI写得很好解决你的问题!

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

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

<tx:jta-transaction-manager/>方法将寻找一个事务管理器中的几个默认位置listed here。如果您的JBoss事务管理器不在其中一个位置,我建议您尽可能将其移动,或者将其移动到Tomcat中,以使两个容器的TM位于同一个JNDI位置。

1

只要在这里添加我的经验,所以我不必再次遭受经验。

至于bmatthews68,Chochos和these posters都说过,在你的Spring bean文件中使用<tx:jta-transaction-manager/>;它绝对提供了适当的抽象级别,并且不需要在Spring端做额外的任何事情。

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

尽管如此:如果像我一样使用Maven,请确保您排除了对javax.transaction:jta jar的任何依赖关系或将范围设置为provided。否则,您将遇到类加载器问题。