RabbitMQ fanout广播消息使用匿名队列

本文介绍如何在RabbitMQ中使用AnonymousQueue创建唯一命名的排他性自动删除队列,探讨不同队列命名策略,并展示如何通过注解方式消费fanout交换机消息。

场景

我们希望发送的消息被所有绑定到这个交换机的所有队列消费到,那么我们通常会用到fanout类型的交换机,

但我们又不想固定队列名称,那么就需要随机的队列名称,RabbitMQ中的AnonymousQueue就是解决这个问题的,通常,当您需要一个唯一命名的排他性自动删除队列时,建议您使用AnonymousQueue而不是broker定义的队列名称(使用“”作为队列名称会导致代理生成队列名称),默认情况下,队列名称以spring.gen-为前缀,后跟UUID的base64表示形式,例如:spring.gen-MRBv9sqISkuCiPfOYfpo4g

实例

//该队列名称以spring.gen-为前缀,后跟UUID的base64表示形式-例如:spring.gen-MRBv9sqISkuCiPfOYfpo4g
@Bean
public Queue anon1() {
    return new AnonymousQueue();
}

//生成一个以某些东西为前缀的队列名称,后跟UUID的base64表示形式
@Bean
public Queue anon2() {
    return new AnonymousQueue(new AnonymousQueue.Base64UrlNamingStrategy("something-"));
}

//仅通过使用UUID(不进行base64转换)来生成名称,例如f20c818a-006b-4416-bf91-643590fedb0e
@Bean
public Queue anon3() {
    return new AnonymousQueue(AnonymousQueue.UUIDNamingStrategy.DEFAULT);
}

您可以提供自己的命名策略,从而可以在队列名称中包括其他信息(例如应用程序名称或客户端主机)。

 

用注解的方式消费

@RabbitListener(bindings = @QueueBinding(
            value = @Queue(),
            exchange = @Exchange(name = Constants.MYFANOUT_MESSAGE_EXCHANGE, type = ExchangeTypes.FANOUT)
    )
    )
    @RabbitHandler
    public void receive(@Payload MyMessage message, @Headers Map<String, Object> headers, Channel channel) throws IOException {
        //todo 业务逻辑
    }

注意上面的监听队列里面没有参数,这里表示自动生成一个匿名队列来消费fanout交换机的消息,匿名队列如下图所示

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值