栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

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

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

需求:
接收第三方回调消息, 两个独立的服务上分别消费这条消息

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 queueNames;
    
    @Value("${rabbitmq.fanout.unbindQueueName}")
    private List unbindQueueNames;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    
    @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()));
        });
    }
}

这样就实现了, 只需要修改配置文件中的队列名称和解除绑定名称, 就可以任意增加队列了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/612385.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号