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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值