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

时间:2015-10-13 13:37:37

标签: spring-boot spring-jms

我有一个Spring Boot应用程序作为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 Data存储库

@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);
    }
}

1 个答案:

答案 0 :(得分:0)

查看当前的Spring Boot代码(JmsAnnotationDrivenConfiguration):

@Autowired(required = false)
private JtaTransactionManager transactionManager;

所以,现在它只需要类型正好JtaTransactionManager的bean。我猜你的两个都是DataSourceTransactionManager

我确定这是正确的解决方法,只担心自动配置的XA tx-manager。

对我而言,您可以在其中一个tx-manager bean上修复@Primary之类的问题。

但是......您的应用程序中是否需要JMS Annotation支持?

也许排除 JmsAnnotationDrivenConfiguration就足够了?

无论如何需要它,我只看到一种方法来解决它:禁用JmsAnnotationDrivenConfiguration并手动配置@EnableJms,绕过tx-manager问题,而不是为{for}配置它{1}}根据您的要求。

有关详细信息,请参阅DefaultJmsListenerContainerFactory源代码。