- 原来交换机和交换机之间也能绑定,路由消息....
- 绑定多个路由键,需要反复调用queueDeclare,但是却不会被识别为变更queue配置,也不会触发异常(在通常情况下,一个队列/交换机在定义之后,如果有配置变更也不允许修改其配置,必须删除后重新建)。
- 匿名队列,独占队列,自动删除
- 独占exclusive队列,只允许创建该队列的connection和channel连接,在channel和connection断开连接之后,独占队列将自动删除,队列内的消息也会丢失。
# 演示目标:
e-pre
是类型为topic的交换机,与其绑定的有
e-a
交换机,路由键为r-a
e-b
交换机,路由键为r-b
e-ab
交换机,路由键为r-a
和r-b
e-a
,e-b
,e-ab
交换机类型都为fanout,分别有q-a
,q-b
,q-ab
与其绑定。
实现的效果为: 消息只投递到
e-pre
交换机,e-pre
交换机根据消息routingKey
分别将消息路由到交换机e-a
,e-b
和e-ab
,再由这三个交换机将消息路由到绑定的队列上。
# 代码实现
package com.futao.techsharingmq.basic.concept.simple.book; import com.futao.techsharingmq.basic.concept.simple.MqChannelUtils; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.BuiltinExchangeType; import com.rabbitmq.client.Channel; import java.io.IOException; import java.nio.charset.StandardCharsets; /** * 将exchange与exchange绑定 * 将exchange的消息路由到另外的exchange,再路由到queue * * @author futao@gmail.com * @date 2021/11/2 */ public class Exchange2Exchange { public static void main(String[] args) throws IOException { // 获取channel Channel channel = MqChannelUtils.createChannel(); //定义topic类型的交换机e-pre channel.exchangeDeclare("e-pre", BuiltinExchangeType.TOPIC); // 定义fanout类型的交换机e-a, e-b, e-ab channel.exchangeDeclare("e-a", BuiltinExchangeType.FANOUT); channel.exchangeDeclare("e-b", BuiltinExchangeType.FANOUT); channel.exchangeDeclare("e-ab", BuiltinExchangeType.FANOUT); // 将e-pre和三个交换机绑定,并且指定路由规格,注意这里使用的是#exchangeBind方法 channel.exchangeBind("e-a", "e-pre", "r-a"); channel.exchangeBind("e-b", "e-pre", "r-b"); // 绑定多个路由键r-a,r-b channel.exchangeBind("e-ab", "e-pre", "r-a"); channel.exchangeBind("e-ab", "e-pre", "r-b"); // 定义匿名队列并获取生成的匿名队列名称 String queue1 = channel.queueDeclare().getQueue(); // 将匿名队列与三个交换机绑定 channel.queueBind(queue1, "e-a", ""); String queue2 = channel.queueDeclare().getQueue(); channel.queueBind(queue2, "e-b", ""); String q3 = channel.queueDeclare().getQueue(); channel.queueBind(q3, "e-ab", ""); // 发送100条消息 for (int i = 0; i < 1000; i++) { // 生成路由键 String rk = "r-b"; if (i % 2 == 0) { rk = "r-a"; } //将消息投递到e-pre交换机 channel.basicPublish("e-pre", rk, new AMQP.BasicProperties(), "success".getBytes(StandardCharsets.UTF_8)); } } }
- 代码流程:
- 创建连接工厂ConnectionFactory,从ConnectionFactory获取Connection连接,在Connection连接基础上开辟Channel信道,基于Channel信号执行操作。
- 创建
e-pre
交换机 - 创建
e-a
,e-b
和e-ad
交换机 - 将
e-pre
和三个交换机绑定,并且指定路由规格,注意这里使用的是#exchangeBind
方法 - 创建匿名队列并与三个交换机绑定
- 匿名队列的属性为: Actively declare a
server-named
exclusive
,autodelete
,non-durable
queue。
- 发送1000条消息到
e-pre
交换机,其中500条的路由键为r-a
,另外500条的路由键为r-b
。
# 结果
当exclusiveQueue对应的channel和Connection关闭之后,exclusiveQueue/绑定关系/消息将自动删除