交换机间路由、绑定多个路由键,匿名队列等

简介: 交换机间路由、绑定多个路由键,匿名队列等
  • 原来交换机和交换机之间也能绑定,路由消息....
  • 绑定多个路由键,需要反复调用queueDeclare,但是却不会被识别为变更queue配置,也不会触发异常(在通常情况下,一个队列/交换机在定义之后,如果有配置变更也不允许修改其配置,必须删除后重新建)。
  • 匿名队列,独占队列,自动删除
  • 独占exclusive队列,只允许创建该队列的connection和channel连接,在channel和connection断开连接之后,独占队列将自动删除,队列内的消息也会丢失。


# 演示目标:



image.png



  • e-pre是类型为topic的交换机,与其绑定的有
  • e-a交换机,路由键为r-a
  • e-b交换机,路由键为r-b
  • e-ab交换机,路由键为r-ar-b


  • e-a, e-b, e-ab交换机类型都为fanout,分别有q-a,q-b,q-ab与其绑定。


实现的效果为: 消息只投递到e-pre交换机,e-pre交换机根据消息routingKey分别将消息路由到交换机e-a, e-be-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));
        }
    }
}


  • 代码流程:
  1. 创建连接工厂ConnectionFactory,从ConnectionFactory获取Connection连接,在Connection连接基础上开辟Channel信道,基于Channel信号执行操作。
  2. 创建e-pre交换机
  3. 创建e-a, e-be-ad交换机
  4. e-pre和三个交换机绑定,并且指定路由规格,注意这里使用的是#exchangeBind方法
  5. 创建匿名队列并与三个交换机绑定
  • 匿名队列的属性为: Actively declare a server-namedexclusive, autodelete, non-durable queue。
  1. 发送1000条消息到e-pre交换机,其中500条的路由键为r-a,另外500条的路由键为r-b


# 结果


image.png

image.png

image.png

image.png


image.png

image.png

image.png


当exclusiveQueue对应的channel和Connection关闭之后,exclusiveQueue/绑定关系/消息将自动删除


image.png

image.png

image.png


image.png


相关文章
|
1天前
|
安全 数据处理 网络虚拟化
|
6月前
|
存储 网络协议 分布式数据库
网络名词术语解析 | 路由、交换机、集线器、半/全双工、DNS、LAN、WAN、端口、MTU
网络名词术语解析 | 路由、交换机、集线器、半/全双工、DNS、LAN、WAN、端口、MTU
153 0
|
7月前
|
网络架构
交换机与路由器技术-27-OSPF路由重分发
交换机与路由器技术-27-OSPF路由重分发
29 0
交换机与路由器技术-27-OSPF路由重分发
|
7月前
|
网络架构
交换机与路由器技术-21-RIP路由协议
交换机与路由器技术-21-RIP路由协议
39 0
|
7月前
|
网络架构
交换机与路由器技术-20-动态路由协议
交换机与路由器技术-20-动态路由协议
28 0
|
7月前
|
网络架构
交换机与路由器技术-18-热备份路由选择协议HSRP
交换机与路由器技术-18-热备份路由选择协议HSRP
38 0
|
7月前
|
网络架构
交换机与路由器技术-12-单臂路由
交换机与路由器技术-12-单臂路由
38 0
|
8月前
|
消息中间件 Java
RabbitMQ 发布确认 交换机 死信队列 延迟队列(下)
RabbitMQ 发布确认 交换机 死信队列 延迟队列(下)
73 0
|
8月前
|
消息中间件 存储
RabbitMQ 发布确认 交换机 死信队列 延迟队列(上)
RabbitMQ 发布确认 交换机 死信队列 延迟队列(上)
65 0
|
9月前
|
消息中间件
什么是死信交换机 ? 如何为队列绑定死信交换机 ?
死信交换机(Dead-Letter Exchange)是一个特殊的交换机,用于接收和路由成为死信的消息。
432 0