RabbitMQ( 发布订阅模式 ==> FanoutExchange )

本章目录:

  • 何为发布订阅模式
  • FanoutExchange具体使用

一、何为发布订阅模式

在上一篇文章中,我们创建了Work Queue并且发送任务,在Work Queue中,每个任务只会被一个消费者消费,任务消费后就被清除了。

而在本篇中,我们将做一些完全不同的事情——我们将向多个消费者传递消息。这种模式被称为“发布/订阅”

我们先看看其模式图

该模式核心思想如下:

是生产者从不直接向队列发送任何消息。实际上,生产者通常根本不知道消息是否会被传递到任何队列。

相反,生产者只能向交换器发送消息(图片上的蓝色圆圈)。交换是一件非常简单的事情。一方面,它接收来自生产者的消息,另一方面,它将消息推送到队列。交换器必须确切地知道如何处理接收到的消息。它应该被附加到特定的队列中吗?它应该被添加到多个队列中吗?还是应该被丢弃?其规则由交换类型定义

本章主要学习FanoutExchange,它只是将接收到的所有消息广播给它所知道的所有队列,也称为广播

二、 FanoutExchange具体使用

在消费者服务内新建config配置类,我们需要声明

  • 交换机
  • 队列
  • 交换机与队列绑定

config如下:

@Configuration
public class FanoutConfig {
    ///声明交换机
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("brrbaii.fanout");
    }

    //声明队列
    @Bean("queueA")
    public Queue fanoutQueueA(){
        return new Queue("brrbaii.queueA");
    }

    @Bean("queueB")
    public Queue fanoutQueueB(){
        return new Queue("brrbaii.queueB");
    }

    //绑定队列A
    @Bean
    public Binding fanoutBindingA(@Qualifier("queueA")Queue qA,FanoutExchange fanoutExchange){
        //我们将绑定多个队列,这里按byName注入
        return BindingBuilder
                .bind(qA)
                .to(fanoutExchange);
    }
    //绑定队列A
    @Bean
    public Binding fanoutBindingB(@Qualifier("queueB")Queue qB,FanoutExchange fanoutExchange){
        //我们将绑定多个队列,这里按byName注入
        return BindingBuilder
                .bind(qB)
                .to(fanoutExchange);
    }
}

接着声明消费者,分别接听两个队列

@Component
public class SpringRabbitMQListener {

    @RabbitListener(queues = "brrbaii.queueA")
    public void listenFanoutQueueA(String msg) {
        System.out.println("queueA:"+msg);

    }

    @RabbitListener(queues = "brrbaii.queueB")
    public void listenFanoutQueueB(String msg) {
        System.out.println("queueB:"+msg);
    }

发送消息

观察结果,两个队列都收到了消息,完成了向多个消费者传递消息



我们也可以不声明配置类,采用注解完成队列和交换机的绑定

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "brrbaii.queueA"),
            exchange = @Exchange(name = "brrbaii.fanout")
    ))
    public void lA(String msg){
        System.out.println("queueA"+msg);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "brrbaii.queueB"),
            exchange = @Exchange(name = "brrbaii.fanout")
    ))
    public void lB(String msg){
        System.out.println("queueA"+msg);
    }

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白日日白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值