2008-09-22 154 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。否則,您將遇到類加載器問題。