springboot中使用RabbitMq根据配置文件中定义队列名,实现动态创建多个队列并绑定到fanout交换机上
@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()));
});
}
}