场景
我们希望发送的消息被所有绑定到这个交换机的所有队列消费到,那么我们通常会用到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交换机的消息,匿名队列如下图所示