RabbitMQ的交换机类型及简单实践

 温馨提示:

以下需要控制台声明队列跟交换机的操作也可用代码实现,具体实现方式见以下文章:

RabbitMQ----代码声明队列及交换机(注解方式)-CSDN博客

交换机类型

真正生产环境都会经过exchange来发送消息,而不是直接发送到队列,交换机的类型有以下三种:

  • Fanout:广播
  • Direct:定向
  • Topic: 话题

一、Fanout(广播)交换机

Fanout Exchange 会将接收到的消息广播到每一个跟其绑定的queue,所以也叫广播模式

利用SpringAMQP演示FanoutExchange的使用
实现思路如下:

  1. 在RabbitMQ控制台中,声明队列fanout.queue1和fanout.queue2
  2. 在RabbitMQ控制台中,声明交换机hmall.fanout,将两个队列与其绑定
  3. 在consumer服务中,编写两个消费者方法,分别监听fanout.queue1和fanout.queue2
  4. 在publisher中编写测试方法,向hmall.fanout发送消息

1、控制台声明队列

2、控制台声明交换机

2.1、声明交换机

2.2、绑定队列

3、编写模拟消费者

 @RabbitListener(queues = "fanout.queue1")  //监听的队列:fanout.queue1
    public void listenFanoutQueue1(String msg) throws InterruptedException {
        System.out.println("消费者1  收到消息:【"+msg+"】");
    }

    @RabbitListener(queues = "fanout.queue2")  //监听的队列:fanout.queue2
    public void listenFanoutQueue2(String msg) throws InterruptedException {
        System.out.println("消费者2  收到消息:【"+msg+"】");
    }

4、编写模拟发送者 

@Test
    void testSendFanout(){
        String exchangeName = "hmall.fanout";
        String msg = "hello, fanout everyone";
        rabbitTemplate.convertAndSend(exchangeName,null,msg);
    }

注意:此处的bingingKey为null,表示以广播的形式把消息发送到每个与之关联的队列上 

5、结果显示

 二、Direct(定向)交换机

Direct Exchange 会将接收到的消息根据规则路由到指定的Queue,因此称为定向路由

  • 每一个Queue都与Exchange设置一个BindingKey
  • 发布者发送消息时,指定消息的RoutingKey
  • Exchange将消息路由到BindingKey与消息RoutingKey一致的队列

利用SpringAMQP演示DirectExchange的使用
需求如下:

  1. 在RabbitMO控制台中,声明队列direct.queue1和direct.queue2
  2. 在RabbitMQ控制台中,声明交换机hmall.direct,将两个队列与其绑定
  3. 在consumer服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2
  4. 在publisher中编写测试方法,利用不同的RoutingKey向hmall.direct发送消息

1、控制台声明队列

2、控制台声明交换机

2.1、声明交换机

2.2、绑定队列并定义key

3、编写模拟消息消费者

    @RabbitListener(queues = "direct.queue1")  //监听的队列:direct.queue1
    public void listenDirectQueue1(String msg) throws InterruptedException {
        System.out.println("消费者1  收到消息:【"+msg+"】");
    }

    @RabbitListener(queues = "direct.queue2")  //监听的队列:direct.queue2
    public void listenDirectQueue2(String msg) throws InterruptedException {
        System.out.println("消费者2  收到消息:【"+msg+"】");
    }

4、编写模拟消息发送者

    @Test
    void testSendDirect(){
        String exchangeName = "hmall.direct";
        String msg = "hello, direct 绿色警报";
        rabbitTemplate.convertAndSend(exchangeName,"red",msg); //两个队列都能收到该消息
        rabbitTemplate.convertAndSend(exchangeName,"blue",msg); //只有direct.queue1队列能收到该消息
        rabbitTemplate.convertAndSend(exchangeName,"yellow",msg); //只有direct.queue2队列能收到该消息
    }

5、结果显示

三、 Topic(主题)交换机 

TopicExchange与DirectExchange类似,区别在于routingKey可以是多个单词的列表,并且以 . 分割。

Queue与Exchange指定BindingKey时可以使用通配符:
# :代指0个或多个单词
* :代指一个单词 

案例:利用SpringAMQP演示DirectExchange的使用
需求如下:

  1. 在RabbitMQ控制台中,声明队列topic.queue1和topic.queue2
  2. 在RabbitMQ控制台中,声明交换机hmall.topic ,将两个队列与其绑定
  3. 在consumer服务中,编写两个消费者方法,分别监听topic.queue1和topic.queue2
  4. 在publisher中编写测试方法,利用不同的RoutingKey向hmall.topic发送消息 

1、控制台声明队列

2、控制台声明交换机

2.1、声明交换机

2.2、绑定交换机并配置key

3、编写模拟消息消费者

@RabbitListener(queues = "topic.queue1")  //监听的队列:topic.queue1
    public void listenTopicQueue1(String msg) {
        System.out.println("消费者1  收到消息:【"+msg+"】");
    }

    @RabbitListener(queues = "topic.queue2")  //监听的队列:topic.queue2
    public void listenTopicQueue2(String msg) {
        System.out.println("消费者2  收到消息:【"+msg+"】");
    }

4、编写模拟消息发送者

    @Test
    void testSendTopic(){
        String exchangeName = "hmall.topic";
        String msg = "hello, topic 日本的新闻";
        rabbitTemplate.convertAndSend(exchangeName,"china.news",msg); //两个队列都能收到该消息
        rabbitTemplate.convertAndSend(exchangeName,"china.weather",msg); //topic.queue1队列能收到该消息
        rabbitTemplate.convertAndSend(exchangeName,"japan.news",msg); //topic.queue2队列能收到该消息
    }

5、结果显示

Direct交换机与Topic交换机的差异!

  • Topic交换机接收的消息RoutingKey可以是多个单词,以 分割
  • Topic交换机与队列绑定时的bindingKey可以指定通配符
  • # : 代表0个或多个词
  • *  : 代表1个词
  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值