这篇文章,主要介绍消息队列RabbitMQ七种模式之Routing路由键模式。
目录
一、消息队列
1.1、Routing模式
RabbitMQ中提供的Routing模式,就是根据RoutingKey来决定这条消息应该分发到哪个Queue队列里面,一般的,Routing模式中Exchange交换机都是采用【direct】直接模式。生产者发送的每一条消息都会携带一个routing key,Exchange根据这个routing key将其分发到对应的Queue队列里面。一个Queue队列可以绑定多个routing key。

注意:如果Exchange交换机接收到的消息,没法根据routing key将其分发到指定的Queue队列里面,那么这一条消息默认就会被丢弃。
1.2、案例代码
(1)引入依赖
  
   - 
    
     
    
    
     
      <!-- 引入 RabbitMQ 依赖 -->
     
    
- 
    
     
    
    
     
      <dependency>
     
    
- 
    
     
    
    
         
      <groupId>com.rabbitmq
      </groupId>
     
    
- 
    
     
    
    
         
      <artifactId>amqp-client
      </artifactId>
     
    
- 
    
     
    
    
         
      <version>5.16.0
      </version>
     
    
- 
    
     
    
    
     
      </dependency>
     
    
(2)编写生产者
- 生产者发送不同类型的Routing Key的消息。
  
   - 
    
     
    
    
     
      package com.rabbitmq.demo.routing;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      import com.rabbitmq.client.Channel;
     
    
- 
    
     
    
    
     
      import com.rabbitmq.client.Connection;
     
    
- 
    
     
    
    
     
      import com.rabbitmq.client.ConnectionFactory;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      /**
     
    
- 
    
     
    
    
     
       * @version 1.0.0
     
    
- 
    
     
    
    
     
       * @Date: 2023/2/25 16:23
     
    
- 
    
     
    
    
     
       * @Copyright (C) ZhuYouBin
     
    
- 
    
     
    
    
     
       * @Description: 消息生产者
     
    
- 
    
     
    
    
     
       */
     
    
- 
    
     
    
    
     
      public 
      class 
      Producer {
     
    
- 
    
     
    
    
         
      public 
      static 
      void 
      main
      (String[] args) {
     
    
- 
    
     
    
    
             
      // 1、创建连接工厂
     
    
- 
    
     
    
    
             
      ConnectionFactory 
      factory 
      = 
      new 
      ConnectionFactory();
     
    
- 
    
     
    
    
             
      // 2、设置连接的 RabbitMQ 服务地址
     
    
- 
    
     
    
    
     
              factory.setHost(
      "127.0.0.1"); 
      // 默认就是本机
     
    
- 
    
     
    
    
     
              factory.setPort(
      5672); 
      // 默认就是 5672 端口
     
    
- 
    
     
    
    
             
      // 3、获取连接
     
    
- 
    
     
    
    
             
      Connection 
      connection 
      = 
      null; 
      // 连接
     
    
- 
    
     
    
    
             
      Channel 
      channel 
      = 
      null; 
      // 通道
     
    
- 
    
     
    
    
             
      try {
     
    
- 
    
     
    
    
     
                  connection = factory.newConnection();
     
    
- 
    
     
    
    
                 
      // 4、获取通道
     
    
- 
    
     
    
    
     
                  channel = connection.createChannel();
     
    
- 
    
     
    
    
                 
      // 5、声明 Exchange,如果不存在,则会创建
     
    
- 
    
     
    
    
                 
      String 
      exchangeName 
      = 
      "exchange_direct_2023";
     
    
- 
    
     
    
    
     
                  channel.exchangeDeclare(exchangeName, 
      "direct");
     
    
- 
    
     
    
    
                 
      // 6、发送消息
     
    
- 
    
     
    
    
                 
      for (
      int 
      i 
      = 
      0; i < 
      10; i++) {
     
    
- 
    
     
    
    
                     
      // 路由键唯一标识
     
    
- 
    
     
    
    
                     
      String 
      routingKey 
      = 
      "error";
     
    
- 
    
     
    
    
                     
      if (i % 
      3 == 
      0) {
     
    
- 
    
     
    
    
     
                          routingKey = 
      "info";
     
    
- 
    
     
    
    
     
                      } 
      else 
      if (i % 
      3 == 
      1) {
     
    
- 
    
     
    
    
     
                          routingKey = 
      "warn";
     
    
- 
    
     
    
    
     
                      }
     
    
- 
    
     
    
    
                     
      String 
      message 
      = 
      "这是Routing模式,发送的第【" + (i+
      1) + 
      "】条【" + routingKey + 
      "】消息数据";
     
    
- 
    
     
    
    
     
                      channel.basicPublish(exchangeName, routingKey, 
      null, message.getBytes());
     
    
- 
    
     
    
    
     
                  }
     
    
- 
    
     
    
    
     
              } 
      catch (Exception e) {
     
    
- 
    
     
    
    
     
                  e.printStackTrace();
     
    
- 
    
     
    
    
     
              } 
      finally {
     
    
- 
    
     
    
    
                 
      if (
      null != channel) {
     
    
- 
    
     
    
    
                     
      try {
     
    
- 
    
     
    
    
     
                          channel.close();
     
    
- 
    
     
    
    
     
                      } 
      catch (Exception e) {}
     
    
- 
    
     
    
    
     
                  }
     
    
- 
    
     
    
    
                 
      if (
      null != connection) {
     
    
- 
    
     
    
    
                     
      try {
     
    
- 
    
     
    
    
     
                          connection.close();
     
    
- 
    
     
    
    
     
                      } 
      catch (Exception e) {}
     
    
- 
    
     
    
    
     
                  }
     
    
- 
    
     
    
    
     
              }
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
     
      }
     
    
(3)编写消费者
- 不同的消费者可以从同一个Queue队列里面获取不同的Routing Key的消息。
- 假设:消费者A接收routingKey="info"的消息;消费者B接收routingKey="error"的消息。
  
   - 
    
     
    
    
     
      package com.rabbitmq.demo.routing;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      import com.rabbitmq.client.*;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      import java.io.IOException;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      /**
     
    
- 
    
     
    
    
     
       * @version 1.0.0
     
    
- 
    
     
    
    
     
       * @Date: 2023/2/25 16:30
     
    
- 
    
     
    
    
     
       * @Copyright (C) ZhuYouBin
     
    
- 
    
     
    
    
     
       * @Description: 消息消费者
     
    
- 
    
     
    
    
     
       */
     
    
- 
    
     
    
    
     
      public 
      class 
      Consumer {
     
    
- 
    
     
    
    
         
      public 
      static 
      void 
      main
      (String[] args) {
     
    
- 
    
     
    
    
             
      // 1、创建连接工厂
     
    
- 
    
     
    
    
             
      ConnectionFactory 
      factory 
      = 
      new 
      ConnectionFactory();
     
    
- 
    
     
    
    
             
      // 2、设置连接的 RabbitMQ 服务地址
     
    
- 
    
     
    
    
     
              factory.setHost(
      "127.0.0.1"); 
      // 默认就是本机
     
    
- 
    
     
    
    
     
              factory.setPort(
      5672); 
      // 默认就是 5672 端口
     
    
- 
    
     
    
    
             
      // 3、获取连接
     
    
- 
    
     
    
    
             
      Connection 
      connection 
      = 
      null; 
      // 连接
     
    
- 
    
     
    
    
             
      Channel 
      channel 
      = 
      null; 
      // 通道
     
    
- 
    
     
    
    
             
      try {
     
    
- 
    
     
    
    
     
                  connection = factory.newConnection();
     
    
- 
    
     
    
    
                 
      // 4、获取通道
     
    
- 
    
     
    
    
     
                  channel = connection.createChannel();
     
    
- 
    
     
    
    
                 
      // 5、声明 Exchange,如果不存在,则会创建
     
    
- 
    
     
    
    
                 
      String 
      exchangeName 
      = 
      "exchange_direct_2023";
     
    
- 
    
     
    
    
     
                  channel.exchangeDeclare(exchangeName, 
      "direct");
     
    
- 
    
     
    
    
                 
      // 6、指定需要操作的消息队列,如果队列不存在,则会创建
     
    
- 
    
     
    
    
                 
      String 
      queueName 
      = 
      "queue_direct_2023";
     
    
- 
    
     
    
    
     
                  channel.queueDeclare(queueName, 
      false, 
      false, 
      false, 
      null);
     
    
- 
    
     
    
    
                 
      // 7、绑定 Exchange 和 Queue, 接收 routingKey = "info" 的消息
     
    
- 
    
     
    
    
     
                  channel.queueBind(queueName, exchangeName, 
      "info");
     
    
- 
    
     
    
    
                 
      // 8、消费消息
     
    
- 
    
     
    
    
                 
      DeliverCallback 
      callback 
      = 
      new 
      DeliverCallback() {
     
    
- 
    
     
    
    
                     
      public 
      void 
      handle
      (String s, Delivery delivery) 
      throws IOException {
     
    
- 
    
     
    
    
                         
      // 接收消息
     
    
- 
    
     
    
    
     
                          System.out.println(
      "这是接收的消息:" + 
      new 
      String(delivery.getBody()));
     
    
- 
    
     
    
    
     
                      }
     
    
- 
    
     
    
    
     
                  };
     
    
- 
    
     
    
    
     
                  channel.basicConsume(queueName, 
      true, callback, i->{});
     
    
- 
    
     
    
    
     
              } 
      catch (Exception e) {
     
    
- 
    
     
    
    
     
                  e.printStackTrace();
     
    
- 
    
     
    
    
     
              }
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
     
      }
     
    
运行消费者、生产者,查看控制台日志输出结果。

到此,RabbitMQ消息队列中的Routing模式介绍完啦。
综上,这篇文章结束了,主要介绍消息队列RabbitMQ七种模式之Routing路由键模式。
转载:https://blog.csdn.net/qq_39826207/article/details/129220343
查看评论
					