Java实战 - 通配符模式

说明:该案例为5.x之前的写法,5.x之后监听方法中某些方法改变了,不过不耽误使用4.x练习

环境:Spring Boot 2.4.1,RabbitMQ 3.8.3,Erlang 22.3,Jar版本 4.10.0

一. 通配符模式:示例图

  • topic交换器通过模式匹配,分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用 “.”隔开。它同样也会识别两个通配符:符号 “#”和符号 “*”。
  • “#”:匹配0个或多个单词
  • “*” :匹配一个单词

  • 匹配模式参考:

二:准备工作与简单模式一致

三. JAVA示例

1. 创建 - 消息生产者

/**
 * @Author zhangbocong
 * @Description 通配符模式 - 生产者
 * @Date 2020/12/29
 * @Param [args]
 * @Return void
 */
public static void main(String[] args) throws Exception {
    // 交换机名称
    String exchangeName = "testExchangeTopics";
    // 路由健名称
    String routingKey = "dog.ca";
    /* 获取连接和通道 */
    Connection connection = RabbitMQUtils.getConnection();
    Channel channel = connection.createChannel();
    //声明交换机 direct:交换机类型 主要有fanout,direct,topic三种
    channel.exchangeDeclare(exchangeName,"topic");
    /* 消息作坊 */
    String message = "Hello World!";
    channel.basicPublish(exchangeName,routingKey,null,message.getBytes());
    System.out.println(message);
    /* 关闭连接和通道 */
    channel.close();
    connection.close();
}

2. 创建 - 消息消费者1

/**
 * @Author zhangbocong
 * @Description 通配符模式 - 消费者1
 * @Date 2020/12/29
 * @Param [args]
 * @Return void
 */
public static void main(String[] args) throws Exception {
    // 交换机名称
    String exchangeName = "testExchangeTopics";
    //消息队列名称
    String queueName = "testDirectQueueOne";
    // 路由健名称
    String routingKey = "dog.*";
    /* 获取连接和通道 */
    Connection connection = RabbitMQUtils.getConnection();
    Channel channel = connection.createChannel();
    //声明通道
    channel.queueDeclare(queueName,false,false,false,null);
    //绑定队列到交换机上,并指定路由键routingKey
    channel.queueBind(queueName,exchangeName,routingKey);
    //同一时刻服务器只发送一条消息给消费端
    channel.basicQos(1);
    //定义消费者
    QueueingConsumer consumer = new QueueingConsumer(channel);
    //监听队列
    channel.basicConsume(queueName,true,consumer);
    while(true){
      QueueingConsumer.Delivery delivery = consumer.nextDelivery();
      String message = new String(delivery.getBody());
      System.out.println(message);
    }
}

3. 创建 - 消息消费者2

/**
 * @Author zhangbocong
 * @Description 路由模式 - 消费者2
 * @Date 2020/12/29
 * @Param [args]
 * @Return void
 */
public static void main(String[] args) throws Exception {
    // 交换机名称
    String exchangeName = "testExchangeTopics";
    //消息队列名称
    String queueName = "testDirectQueueTwo";
    // 路由健名称
    String routingKey = "#.ca";
    /* 获取连接和通道 */
    Connection connection = RabbitMQUtils.getConnection();
    Channel channel = connection.createChannel();
    //声明通道
    channel.queueDeclare(queueName,false,false,false,null);
    //绑定队列到交换机上,并指定路由键routingKey
    channel.queueBind(queueName,exchangeName,routingKey);
    //同一时刻服务器只发送一条消息给消费端
    channel.basicQos(1);
    //定义消费者
    QueueingConsumer consumer = new QueueingConsumer(channel);
    //监听队列
    channel.basicConsume(queueName,true,consumer);
    while(true){
      QueueingConsumer.Delivery delivery = consumer.nextDelivery();
      String message = new String(delivery.getBody());
      System.out.println(message);
    }
}

3. 创建 - 消息消费者3

/**
 * @Author zhangbocong
 * @Description 路由模式 - 消费者2
 * @Date 2020/12/29
 * @Param [args]
 * @Return void
 */
public static void main(String[] args) throws Exception {
    // 交换机名称
    String exchangeName = "testExchangeTopics";
    //消息队列名称
    String queueName = "testDirectQueueThree";
    // 路由健名称
    String routingKey = "cat.#";
    /* 获取连接和通道 */
    Connection connection = RabbitMQUtils.getConnection();
    Channel channel = connection.createChannel();
    //声明通道
    channel.queueDeclare(queueName,false,false,false,null);
    //绑定队列到交换机上,并指定路由键routingKey
    channel.queueBind(queueName,exchangeName,routingKey);
    //同一时刻服务器只发送一条消息给消费端
    channel.basicQos(1);
    //定义消费者
    QueueingConsumer consumer = new QueueingConsumer(channel);
    //监听队列
    channel.basicConsume(queueName,true,consumer);
    while(true){
      QueueingConsumer.Delivery delivery = consumer.nextDelivery();
      String message = new String(delivery.getBody());
      System.out.println(message);
    }
}

4. 输出示例

  • 消息生产者输出:

  • 消息消费者1 输出:

  • 消息消费者2 输出:

  • 消息消费者3 输出: