我使用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 - 使用,而不需要两个不同的配置文件?
我想你已经错过了JNDI点。 JNDI是非常写入解决您的问题!
我想,你可以把它升了一级,所以不是使用“UserTransaction的”或“从JNDI transactionManager的”根据您的情况。 为什么不添加“的JtaTransactionManager”到JNDI。 您配置推送到它应该是,而不是建立更配置文件的JNDI这样[像没有足够已;)]。
您可以使用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作为系统属性
这是一个可行的方法。 看到我的博客更完整的例子。
希望这可以帮助。
如果您在使用Spring 2.5可以使用<TX:JTA事务经理/>。 我还没有与JBoss使用它,但它应根据节为您工作9.8应用服务器专用的集成从Spring参考手册。
该<tx:jta-transaction-manager/>
办法将寻找一个事务管理器中的几个默认位置在这里列出 。 如果你的JBoss事务管理器是不是在这些地点之一,我建议你移动它,如果可能的话,或将在Tomcat中,使两个容器有他们在同一个JNDI位置TM。
刚刚加入我的经验,在这里,所以我不必再重新受害的经历。
作为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
。 否则,你将体验类加载器的问题。