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 | 通过消息头进行路由(不常用) |
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的消息被转发到所有关心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 交换机发消息是最快的。
//消费者代码
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());
}
通过消息头进行路由(不常用)。