RabbitMQ路由模式RoutingKey模式

本文介绍了RabbitMQ的RoutingKey模式,如何通过路由键来控制生产者和消费者的匹配。生产者发送消息时指定路由键,消费者队列绑定时需设定匹配的路由键,如'insert',只有路由键匹配的队列才能接收到对应的消息,实现了对更新、插入和删除操作的精确控制。

RabbitMQ路由模式RoutingKey模式

生产者发送消息到交换机并指定一个路由key,消费者队列绑定到交换机时要制定路由key(key匹配就能接受消息,key不匹配就不能接受消息)

例如:我们可以把路由key设置为insert ,那么消费者队列key指定包含insert才可以接收消息,消费者队列key定义为update或者delete就不能接收消息。很好的控制了更新,插入和删除的操作。

         采用交换机direct模式

注: 

前面做的demo中RoutingKey设置的空

  

RoutingKey有值的时候,那么 经过消息队列之后,需要在经过 RoutingKey进行判断决定 消费者

 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.toov5.rabibitMQScribe</groupId>
  <artifactId>rabibitMQScribe</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <dependencies>
		<dependency>
			<groupId>com.rabbitmq</groupId>
			<artifactId>amqp-client</artifactId>
			<version>3.6.5</version>
		</dependency>
	</dependencies>
  
</project>

 producer

package com.toov5.routing;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.toov5.utils.MQConnectionUtils;

//生产者 交换机类型 producerFanout类型
public class RoutingProducer {
    //交换机名称
     private static final String EXCHANGE_NAME = "my_routing"; 
     public static void main(String[] args) throws IOException, TimeoutException {
        //建立MQ连接
         Connection connection = MQConnectionUtils.newConnection();
        //创建通道
          Channel channel = connection.createChannel();
          //生产者绑定交换机
          channel.exchangeDeclare(EXCHANGE_NAME, "direct");  //交换机名称  交换机类型
          String routingKey="email";
          //创建对应的消息 
          String msString = "my_Routing_destination_msg"+routingKey;
          //通过频道 发送消息
          System.out.println("生产者投递消息:"+msString);
          channel.basicPublish(EXCHANGE_NAME, routingKey, null, msString.getBytes());
          //关闭通道 和 连接
          channel.close();
          connection.close();
    }
    
} 

consumer:

package com.toov5.routing;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.toov5.utils.MQConnectionUtils;

//邮件消费者
public class ConsumerEmailRouting {
    private static final String EMAIL_QUEUE ="email_queue_routing";
    //交换机名称
   private static final String EXCHANGE_NAME = "my_routing"; 
     public static void main(String[] args) throws IOException, TimeoutException {
         System.out.println("邮件消费者启动");
        //建立MQ连接
         Connection connection = MQConnectionUtils.newConnection(); 
        //创建通道
          Channel channel = connection.createChannel();
          
        //消费者声明队列
          channel.queueDeclare(EMAIL_QUEUE, false, false, false, null);
         //消费者队列绑定 路由
          channel.queueBind(EMAIL_QUEUE, EXCHANGE_NAME, "email");
          //消费者监听消息
      DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
              //重写监听方法
             @Override
             public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
                     throws IOException {             
                 String msg = new String(body,"UTF-8");
                 System.out.println("邮件消费者获取生产者消息"+msg);
             }
         };
         channel.basicConsume(EMAIL_QUEUE,true, defaultConsumer);   //绑定队列 事件监听
            
    }
}
package com.toov5.routing;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.toov5.utils.MQConnectionUtils;

//邮件消费者
public class ConsumerSMSRouting {
    private static final String SMS_QUEUE ="sms_queue_routing";
    //交换机名称
   private static final String EXCHANGE_NAME = "my_routing"; 
     public static void main(String[] args) throws IOException, TimeoutException {
         System.out.println("短信消费者启动");
        //建立MQ连接
         Connection connection = MQConnectionUtils.newConnection(); 
        //创建通道
          Channel channel = connection.createChannel();
          
        //消费者声明队列
          channel.queueDeclare(SMS_QUEUE, false, false, false, null);
         //消费者队列绑定 路由
          channel.queueBind(SMS_QUEUE, EXCHANGE_NAME, "email");
         channel.queueBind(SMS_QUEUE, EXCHANGE_NAME, "sms");
          //消费者监听消息
      DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
              //重写监听方法
             @Override
             public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
                     throws IOException {             
                 String msg = new String(body,"UTF-8");
                 System.out.println("邮件消费者获取生产者消息"+msg);
             }
         };
         channel.basicConsume(SMS_QUEUE,true, defaultConsumer);   //绑定队列 事件监听
            
    }
}

 

运行结果:

绑定两个:

 

 

 

 

### 介绍 在RabbitMQ的topic模式中,RoutingKey是一个由点号 “.” 分割的字符串,被点号 “.” 分割开的每一段独立的字符串称为一个单词,例如“com.rabbitmq.client”“java.util.concurrent”等。它是消息的路由规则,用于指定消息对应的队列,和BindingKey一起决定消息如何被路由到队列中。并且消息不能随意设置RoutingKey,必须是由点隔开的一系列标识符组成,标识符上限为255个字节 [^1][^2]。 ### 使用方法 1. **设置RoutingKey**:消息生产者在生产消息时,需要为消息设置RoutingKey。例如在Java代码中,使用`channel.basicPublish`方法发送消息时指定RoutingKey: ```java import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import java.io.IOException; import java.util.concurrent.TimeoutException; public class TopicSend { private final static String EXCHANGE_NAME = "Topic_exchange"; public static void main(String[] args) throws IOException, TimeoutException, InterruptedException { Connection connection = utils.getConnection(); Channel channel = connection.createChannel(); // 声明交换机 channel.exchangeDeclare(EXCHANGE_NAME, "topic"); // 声明key String routingKey = "lazy.pink.rabbit"; for (int i = 0; i < 3; i++) { // 发3条消息 String msg = "msg:" + routingKey + i; channel.basicPublish(EXCHANGE_NAME, routingKey, null, msg.getBytes()); Thread.sleep(20); // 假设每20ms发送一次消息 System.out.println("send:" + msg); } channel.close(); connection.close(); } } ``` 2. **BindingKeyRoutingKey匹配**:消费者在绑定队列和交换机时,需要指定BindingKey。BindingKey同样是点号 “.” 分割的字符串,并且存在两种特殊的字符串用于做模糊匹配:“*” 用于匹配一个单词,“#” 用于匹配多个单词(可以是零个)。例如,BindingKey为“com.#”可以匹配“com.zzc.java”“com.zzc”等;BindingKey为“com.*”可以匹配“com.zzc”“com.java”等 [^2]。 ### 原理 topic模式下,消息生产者将消息交给交换机,交换机根据RoutingKey和BindingKey的匹配规则,将消息路由到对应的队列中。具体原理如下: 1. **消息生产者**:生产消息并为消息设置RoutingKey,然后将消息发送给topic类型的交换机 [^2]。 2. **交换机**:topic类型的交换机实际上是direct类型交换机的一种扩展,它使用通配符在匹配规则上进行了扩展。交换机根据BindingKeyRoutingKey的匹配规则,对消息进行模糊匹配,将消息路由到与之匹配的队列中 [^2]。 3. **队列与消费者**:队列通过BindingKey与交换机绑定,监听该队列的消费者接收并消费队列中的消息 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值