上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

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

guduadmin14小时前

 温馨提示:

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

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

交换机类型

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

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

    一、Fanout(广播)交换机

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

    RabbitMQ的交换机类型及简单实践,第1张

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

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

    1、控制台声明队列

    RabbitMQ的交换机类型及简单实践,第2张

    2、控制台声明交换机

    2.1、声明交换机RabbitMQ的交换机类型及简单实践,第3张

    2.2、绑定队列

    RabbitMQ的交换机类型及简单实践,第4张

    RabbitMQ的交换机类型及简单实践,第5张

    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、结果显示

    RabbitMQ的交换机类型及简单实践,第6张

     二、Direct(定向)交换机

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

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

      RabbitMQ的交换机类型及简单实践,第7张

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

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

      1、控制台声明队列

      RabbitMQ的交换机类型及简单实践,第8张

      2、控制台声明交换机

      2.1、声明交换机

      RabbitMQ的交换机类型及简单实践,第9张

      2.2、绑定队列并定义key

      RabbitMQ的交换机类型及简单实践,第10张

      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、结果显示

      RabbitMQ的交换机类型及简单实践,第11张

      三、 Topic(主题)交换机 

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

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

      RabbitMQ的交换机类型及简单实践,第12张

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

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

      1、控制台声明队列

      RabbitMQ的交换机类型及简单实践,第13张

      2、控制台声明交换机

      2.1、声明交换机

      RabbitMQ的交换机类型及简单实践,第14张

      2.2、绑定交换机并配置key

      RabbitMQ的交换机类型及简单实践,第15张

      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、结果显示

      RabbitMQ的交换机类型及简单实践,第16张

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

      • Topic交换机接收的消息RoutingKey可以是多个单词,以 . 分割
      • Topic交换机与队列绑定时的bindingKey可以指定通配符
      • # : 代表0个或多个词
      • *  : 代表1个词

网友评论

搜索
最新文章
热门文章
热门标签