Spring JTA TransactionManager配置:同时支持Tomcat和JBoss
我有一个将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,而无需两个不同的配置文件?
解决方案
我们可以使用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作为系统属性
这是一种可能的方法。有关更多完整示例,请参见我的博客。
希望这可以帮助。
如果我们使用的是Spring 2.5,则可以使用<tx:jta-transaction-manager />。我没有在JBoss中使用它,但是它应该根据Spring参考手册中的9.8节特定于应用程序服务器的集成为我们工作。
<tx:jta-transaction-manager />
方法将在此处列出的几个默认位置中寻找事务管理器。如果JBoss事务管理器不在这些位置之一,我建议我们尽可能移动它,或者在Tomcat中移动它,以便两个容器的TM都在相同的JNDI位置。
我认为我们已经错过了JNDI的重点。 JNDI是为解决我们遇到的问题而编写的!
我认为我们可以将其提高一个级别,所以根据情况,而不是使用" userTransaction"或者" JNDI的事务管理器"。为什么不将" JtaTransactionManager"添加到JNDI。这样,我们可以将配置推送到应该存在的JNDI,而不是创建更多的配置文件[好像还没有足够的;)]。