RabbitMQ Exchange 交换机

Exchange 交换机: 接收消息,并根据路由键转发消息到所绑定的队列。

在这里插入图片描述
交换机属性

属性名称 介绍
name 交换机名称
type 交换机类型 :direct,topic,fanout,headers
Durability 是否进行持久化
Auto Delete 当最后一个绑定到Exchange上的队列删除后,自动删除
Internal 当前Exchange是否用于RabbitMQ内部使用,默认为False。(大部分不需要)
Arguments 扩展参数,用户扩展AMQP协议,定制化使用

Exchange Type 简介:

type 介绍
Direct Exchange 所有发送到Direct Exchange的消息被转发到RouteKey中指定的Queue
Topic Exchange 所有发送到Topic Exchange的消息被转发到所有关心RouteKey中指定的Topic的Queue上。
Exchange 将RoutKey和某Topic进行模糊匹配,此时队列需要绑定一个Topic
Fanout Exchange 不处理路由键,只需要简单的将队列绑定到交换机上。发送到交换机上都会转发到与该交换机绑定的所有队列上。Fanout 交换机发消息是最快的。
Fanout Exchange 通过消息头进行路由(不常用)

Exchange Type 详解:

Direct Exchange

介绍

Direct Exchange : 所有发送到Direct Exchange的消息被转发到RouteKey中指定的Queue
在这里插入图片描述
     注意:Direct模式可以使用RabbitMQ自带的Exchange:default Exchange,所以不需要将Exchange进行任何绑定(bingding)操作,消息传递时,RouteKey必须完全匹配才会被队列接收,否则会被抛弃。

代码实现

//消费者
//声明 exchange, routingkey, queue, 并将queue和交换机绑定
String queueName = "test001";
//设置交换机
String exchangeName = "exchange001";
String exchangeType = "direct";
String routingKey = "routingKey001";

//声明一个交换机
channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
//声明一个队列
channel.queueDeclare(queueName, true, false, false, null);
//建立关系
channel.queueBind(queueName, exchangeName, routingKey);
// ... 接收消息
//生产者
String exchangeName = "exchange001";
String routingKey = "routingKey0011";
//发布消息
for(int i = 0; i < 5; i++){
    
    
    String msg = "hello rabbitmq " + i;
    //1.exchange  2.routing key
    //默认交换器隐式绑定到每个队列,其路由键等于队列名. 如果没有队列名,则会被删除
    chennel.basicPublish(exchangeName, routingKey, null, msg.getBytes());
}


Topic Exchange

介绍

Topic Exchange: 所有发送到Topic Exchange的消息被转发到所有关心RouteKey中指定的Topic的Queue上。Exchange 将RoutKey和某Topic进行模糊匹配,此时队列需要绑定一个Topic。
在这里插入图片描述
      注意:可以使用通配符进行模糊匹配。

通配符 通配符简介
# 匹配一个词或多个词。eg: log.# 可以匹配到 log.info.add
* 只能匹配一个词。 eg: log.* 只能匹配到 log.info

代码实现

//消费者代码
//设置交换机
String exchangeName = "exchange_topic";
String exchangeType = "topic";
String routingKey = "user.*";

//声明一个交换机
channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
//声明一个队列
channel.queueDeclare(queueName, true, false, false, null);
//建立关系
channel.queueBind(queueName, exchangeName, routingKey);
//生产者
String exchangeName = "exchange_topic";
String routingKey1 = "user.abc";
String routingKey2 = "user.abc.def";

//发布消息
for(int i = 0; i < 5; i++){
    
    
    String msg = "hello rabbitmq " + i;
    //1.exchange  2.routing key
    chennel.basicPublish(exchangeName, routingKey1, null, msg.getBytes());
    chennel.basicPublish(exchangeName, routingKey2, null, msg.concat("def").getBytes());
}


Fanout Exchange

介绍

Fanout Exchange: 不处理路由键,只需要简单的将队列绑定到交换机上。发送到交换机上都会转发到与该交换机绑定的所有队列上。Fanout 交换机发消息是最快的。

在这里插入图片描述
     

代码实现

//消费者代码
String queueName = "fanout001";
String queueName2 = "fanout002";
//设置交换机
String exchangeName = "exchange_fanout";
String exchangeType = "fanout";
String routingKey = "";

//声明一个交换机
channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
//声明一个队列
channel.queueDeclare(queueName, true, false, false, null);
channel.queueDeclare(queueName2, true, false, false, null);
//建立关系
channel.queueBind(queueName, exchangeName, routingKey);
channel.queueBind(queueName2, exchangeName, routingKey);
//生产者代码
String exchangeName = "exchange_fanout";
String routingKey = "";

//发布消息
for(int i = 0; i < 5; i++){
    
    
    String msg = "hello rabbitmq " + i;
    //1.exchange  2.routing key
    //默认交换器隐式绑定到每个队列,其路由键等于队列名. 如果没有队列名,则会被删除
    chennel.basicPublish(exchangeName, routingKey, null, msg.getBytes());
}

Fanout Exchange

介绍

通过消息头进行路由(不常用)。

猜你喜欢

转载自blog.csdn.net/gpweixing/article/details/113769270