2015-10-13 58 views
2

我有一个春天启动的应用程序作为一个Spring JMS监听器。我为Oracle配置了多个数据源管理器,另一个配置了DB2。禁用事务管理可以在Spring的JMS的监听

无论何时我开始应用程序,jms listener容器正在寻找一个事务管理器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事务功能?下面

是我对我的主弹簧引导类添加注释。还我使用春数据仓库

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

您使用哪种弹簧启动版本。 –

+0

我正在使用1.2.3.RELEASE的春季启动 –

+1

更新到最新的1.2.6 ...早期版本的JMS自动配置依赖于PlatformTransactionManager新版本特定的JtaTransactionManager(通常)意识到在那里进行交易。 –

回答

0

展望当前春季启动代码,我们有(JmsAnnotationDrivenConfiguration):

@Autowired(required = false) 
private JtaTransactionManager transactionManager; 

所以,现在只需要在bean这正是JtaTransactionManager的类型。我猜你们都是DataSourceTransactionManager

我敢肯定,这是正确的修复只担心XA TXX管理器的自动配置。

对我来说,你可以在你的一个tx-manager bean上修复你的问题,如@Primary

但是...你需要在你的应用程序中的JMS注解支持呢?

也许它会刚好到排除JmsAnnotationDrivenConfiguration以及?

如果需要也无妨,我看到的只有一个办法解决它:禁用JmsAnnotationDrivenConfiguration和手动配置@EnableJms,绕过TX-管理问题,并为您的要求就是不将其配置为DefaultJmsListenerContainerFactory

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

+0

嗨Artem,我刚刚将弹簧启动版本更改为最新版本,它停止给出该错误。在更改版本之前,我尝试过提供像尝试排除JmsAnnotationDrivenConfiguration一样的建议,但是当我将此添加到@SpringBootApplication(exclude = {})时没有JmsAnnotationDrivenConfiguration.class。如果你让我知道如何像上面提到的那样手动配置@EnableJms,或者共享一个示例链接,那就太好了。 –

+0

1.不确定为什么你没有'JmsAnnotationDrivenConfiguration',因为它是你上面的StackTrace的一部分。 2.请参阅Spring手册关于'@ EnableJms':http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html#jms-annotated –