Spring boot 在SpringJMS侦听器中禁用事务管理

Spring boot 在SpringJMS侦听器中禁用事务管理,spring-boot,spring-jms,Spring Boot,Spring Jms,我有一个spring引导应用程序作为spring JMS侦听器。我已经配置了多个数据源管理器,一个用于Oracle,另一个用于DB2 每当我启动应用程序时,jms侦听器容器都在寻找一个事务管理器bean,并在找到两个bean时给出以下错误 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.jms

我有一个spring引导应用程序作为spring JMS侦听器。我已经配置了多个数据源管理器,一个用于Oracle,另一个用于DB2

每当我启动应用程序时,jms侦听器容器都在寻找一个事务管理器bean,并在找到两个bean时给出以下错误

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.jms.JmsAnnotationDrivenConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.transaction.PlatformTransactionManager org.springframework.boot.autoconfigure.jms.JmsAnnotationDrivenConfiguration.transactionManager; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: db2TransactionManager,oracleTransactionManager
我不想维护JMS事务。我如何实现它,或者我们如何禁用jms事务特性

下面是我在主spring引导类中添加的注释。我也在使用Spring数据存储库

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class})
@ComponentScan(basePackages = "com.deere.oracledataupdate.*")
//@EnableJpaRepositories(basePackages ="com.deere.oracledataupdate.dao.springdata")
@EntityScan(basePackages = "com.deere.oracledataupdate.*")
@PropertySource({ "classpath:application-${IafConfigSuffix}.properties" })

public class Application extends SpringBootServletInitializer { 

public static void main(String[] args) {

        SpringApplication.run(Application.class, args);
    }
}

查看我们当前的Spring引导代码(
JmsAnnotationDrivenConfiguration
):

因此,现在它只需要bean,它的类型正好是
JtaTransactionManager
。我猜你们俩都是
DataSourceTransactionManager

我确信这是正确的修复方法,只需担心自动配置的
XA
tx管理器

在我看来,您可以在一个tx manager bean上使用类似于
@Primary
的东西来解决问题

但是。。。您的应用程序中是否需要JMS注释支持

也许它也足以排除JmsAnnotationDrivenConfiguration

如果仍然需要它,我只看到一种方法来修复它:禁用
JmsAnnotationDrivenConfiguration
并手动配置
@EnableJms
,绕过tx管理器问题,只是不根据您的请求为
DefaultJmsListenerContainerFactory
配置它


有关更多信息,请参阅
JmsAnnotationDrivenConfiguration
源代码。

您使用的是哪个spring引导版本。我使用的是1.2.3.spring引导更新的最新版本1.2.6。。。早期版本的JMS自动配置依赖于
PlatformTransactionManager
较新版本的特定
JtaTransactionManager
,因为在那里有事务(通常)是有意义的。将版本更改为最新版本后,它就工作了:)感谢DeinumHi Artem,我刚刚将spring启动版本更改为最新版本,它不再给出那个错误。在更改版本之前,我尝试了您提供的建议,如尝试排除JmsAnnotationDrivenConfiguration,但在我将其添加到@SpringBootApplication(排除={})时,没有JmsAnnotationDrivenConfiguration.class。如果您让我知道如何像您提到的那样手动配置@EnableJms,或者共享一个示例链接,那就太好了。1。不确定为什么没有
JmsAnnotationDrivenConfiguration
,因为它是上面StackTrace的一部分。2.请参阅Spring手册中关于
@EnableJms
@Autowired(required = false)
private JtaTransactionManager transactionManager;