需求:
接收第三方回调消息, 两个独立的服务上分别消费这条消息
yml配置:
rabbitmq:
fanout:
exchangeName: test
# 解除绑定队列名称(解除后,会在增加和绑定 queueName中的队列)
# 防止queueName中减少队列时,仍然存在绑定的关系
unbindQueueName: test1,test2
# 增加队列 & 绑定队列名称
queueName: test1,test2
配置类:
@Configuration
public class FanoutRabbitConfig implements ApplicationContextAware
{
/** 交换机名称*/
@Value("${rabbitmq.fanout.exchangeName}")
private String fanoutExchangeName;
/** 队列集合*/
@Value("#{'${rabbitmq.fanout.queueName}'.split(',')}")
private List<Queue> queueNames;
/** 解除绑定队列名称*/
@Value("${rabbitmq.fanout.unbindQueueName}")
private List<String> unbindQueueNames;
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 声明广播类型交换机
*
* @return 广播类型交换机
*/
@Bean
public FanoutExchange fanoutExchange()
{
return new FanoutExchange(fanoutExchangeName);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory();
// 解除队列绑定(不删除队列, 可根据需求删除不需要的队列)
unbindQueueNames.forEach(queueName -> rabbitTemplate.execute(channel -> channel.queueUnbind(queueName, fanoutExchangeName, "", Collections.emptyMap())));
// 重新添加队列 & 绑定
// 注册bean
queueNames.forEach(queue ->
{
// 增加队列
beanFactory.registerSingleton("fanout_" + queue.getName(), queue);
// 绑定队列到交换机
beanFactory.registerSingleton("fanout_" + queue.getName() + "_Binding", BindingBuilder.bind(queue).to(fanoutExchange()));
});
}
}
这样就实现了, 只需要修改配置文件中的队列名称和解除绑定名称, 就可以任意增加队列了