Spring JTA TransactionManager config:支持Tomcat和JBoss

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

我有两种情况都可以工作,但我现在发现我似乎需要为这两种情况分别使用两种Spring配置。 使用JOTM,我需要使用Spring的JotmFactoryBean

      

但是在JBoss中,我只需要从JNDI获取“TransactionManager”:

          

有没有办法配置它,以便使用适当的TransactionManager – JBoss或JOTM – 而不需要两个不同的配置文件?

我想你已经错过了JNDI的观点。 JNDI几乎是用来解决你遇到的问题的!

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

您可以使用PropertyConfigurerPlaceholder注入bean引用以及简单值。

例如,如果你调用你的bean’jotm’和’jboss’那么你可以注入你的TM,如:

     ... ...    

然后您可以使用交换事务管理器

  • transaction.strategy =属性文件中的jotm
  • -Dtransaction.strategy = jotm作为系统属性

这是一种可能的方法。 有关更完整的示例,请参阅我的博客 。

希望这可以帮助。

如果您使用的是Spring 2.5,则可以使用。 我没有将它与JBoss一起使用,但根据第9.8节“Spring参考手册”中特定于应用程序服务器的集成 ,它应该适用于您。

方法将在此处列出的几个默认位置中查找事务管理器。 如果你的JBoss事务管理器不在其中一个位置,我建议你移动它,如果可能的话,或者在Tomcat中移动它,这样两个容器的TM都在同一个JNDI位置。

只是在这里添加我的经验,所以我不必再次重新体验这种体验。

正如bmatthews68,Chochos和这些海报所说,在你的Spring bean文件中使用 ; 它绝对提供了适当的抽象级别,并且没有必要在Spring方面做任何额外的事情。

至于Tomcat,我在默认/共享conf/context.xml文件中声明了 ,该文件绑定到java:comp/UserTransaction 。 由于这是Spring搜索的地方之一,您不需要做任何其他事情。

但有一个问题:如果像我一样使用Maven,请确保排除javax.transaction:jta jar上的任何依赖项或将范围设置为provided 。 否则您将遇到类加载器问题。