目录
一、问题描述:
在项目中创建消息队列和交换机绑定的时候,发现在同一个服务中,创建多个队列分别绑定不同的交换机,只有最后一个可以绑定成功。
二、错误代码
ImportOrganizationRabbitConfig.java
@Configuration
public class ImportOrganizationRabbitConfig {
@Bean
public Queue ImportOrganizationDirectQueue() {
// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
// return new Queue("TestDirectQueue",true,true,false);
//一般设置一下队列的持久化就好,其余两个就是默认false
return new Queue("ImportOrganizationDirectQueue",true);
}
@Bean
DirectExchange ImportOrganizationDirectExchange() {
return new DirectExchange("ImportOrganizationDirectExchange",true,false);
}
@Bean
Binding bindingDirect() {
return BindingBuilder.bind(ImportOrganizationDirectQueue())
.to(ImportOrganizationDirectExchange()).with("ImportOrganizationDirectRouting");
}
@Bean
DirectExchange lonelyDirectExchange() {
return new DirectExchange("lonelyDirectExchange");
}
}
ImportUserRabbitConfig.java
@Configuration
public class ImportUserRabbitConfig {
@Bean
public Queue ImportUserDirectQueue() {
// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
// return new Queue("TestDirectQueue",true,true,false);
//一般设置一下队列的持久化就好,其余两个就是默认false
return new Queue("ImportUserDirectQueue",true);
}
@Bean
DirectExchange ImportUserDirectExchange() {
// return new DirectExchange("GroupDirectExchange",true,true);
return new DirectExchange("ImportUserDirectExchange",true,false);
}
@Bean
Binding bindingDirect() {
return BindingBuilder.bind(ImportUserDirectQueue())
.to(ImportUserDirectExchange()).with("ImportUserDirectRouting");
}
@Bean
DirectExchange lonelyDirectExchange() {
return new DirectExchange("lonelyDirectExchange");
}
}
三、绑定失败和成功截图
绑定失败:
绑定成功:
四、解决问题
这是spring的问题,在我的配置类中,绑定队列和交换机的两个方法名一样,都是bindingDirect()。spring不会允许两个bean的beanName相同。所以我把Binding bindingDirect()方法名改了,或者在@bean 中指定方法名区分一下就好了。