2017-08-09 97 views
3

我想通过xml使用spring启动应用程序连接并使用两个不同的rabbitmq群集。当在应用程序上下文中创建单个rabbit:connection-factory bean时,它可以很好地工作。但是,添加第二个时,无法启动应用程序并出现错误“org.springframework.boot.autoconfigure.amqp.RabbitAnnotationDrivenConfiguration中方法rabbitListenerContainerFactory的参数1需要单个bean,但找到2个:”。我如何着手为每个群集创建不同的工厂?如果这不是正确的方法,请提出一个替代方法来做到这一点?春季启动无法创建多个兔子连接工厂

这里是XML片段:

<rabbit:connection-factory id="firstConnectionFactory" connection-factory="firstSpringConnectionFactory" /> 
<rabbit:connection-factory id="secondConnectionFactory" connection-factory="secondSpringConnectionFactory"/> 
<bean id="firstSpringConnectionFactory" 
class="org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean"> 
    <property name="useSSL" value="${rabbitmq.ssl.enabled}" /> 
    <property name="host" value="${rabbitmq.first.host}"/> 
    <property name="virtualHost" value="${rabbitmq.vhost}"/> 
    <property name="port" value="${rabbitmq.cluster.port}"/> 
    <property name="username" value="${rabbitmq.user}"/> 
    <property name="password" value="${rabbitmq.first.password}"/> 
</bean> 

<bean id="secondSpringConnectionFactory" 
class="org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean"> 
    <property name="useSSL" value="${rabbitmq.ssl.enabled}" /> 
    <property name="host" value="${rabbitmq.second.host}"/> 
    <property name="virtualHost" value="${rabbitmq.vhost}"/> 
    <property name="port" value="${rabbitmq.cluster.port}"/> 
    <property name="username" value="${rabbitmq.user}"/> 
    <property name="password" value="${rabbitmq.second.password}"/> 
</bean> 

与听者容器代码:

ConnectionFactory cf = rabbitConnectionFactory;//One of the connnection factories will be injected here from app context 
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
container.setConnectionFactory(cf); 
container.setConcurrentConsumers(count); 
container.addQueueNames(queueName); 
container.setMessageListener(listener); 
container.start(); 

回答

2

既然你不依赖于Spring启动这里不使用Spring AMQP注释支持我建议你excludeRabbitAnnotationDrivenConfiguration从自动配置:

@EnableAutoConfiguration(exclude={RabbitAnnotationDrivenConfiguration.class}) 

spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.amqp.RabbitAnnotationDrivenConfiguration 

如果您仍然需要@RabbitListener在项目的其他位置,您只能选择构建所有@EnableRabbit基础设施manually

+0

Thanks @Artem,通过排除类RabbitAutoConfiguration @EnableAutoConfiguration(排除= {org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration.class}) – tj23

+0

非常棒!现在考虑这个:https://stackoverflow.com/help/someone-answers –

+0

当然,我要运行一些测试,看看是否因为这个改变而没有任何破解,并接受你的回答:) – tj23