springboot中使用RabbitMq根据配置文件中定义队列名,实现动态创建多个队列并绑定到fanout交换机上

时间:2025-04-13 20:12:45
@Configuration public class FanoutRabbitConfig implements ApplicationContextAware { /** 交换机名称*/ @Value("${}") private String fanoutExchangeName; /** 队列集合*/ @Value("#{'${}'.split(',')}") private List<Queue> queueNames; /** 解除绑定队列名称*/ @Value("${}") 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())); }); } }