RabbitMQ 中的交换机学习

embedded/2024/10/21 16:40:44/

RabbitMQ 中的交换机学习


一、直接交换机(Direct Exchange)

1. 介绍

Direct 交换机将消息路由到绑定了指定 Routing Key 的队列中。每条消息都有一个 Routing Key,当队列绑定到 Direct 交换机时,它需要一个指定的 Routing Key。只有消息的 Routing Key 与队列绑定的 Routing Key 完全匹配时,消息才会路由到该队列中。

2. 代码示例
- 发送消息
public class DirectLogs {public static final String exchange_name = "direct_logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtils.getChannel();Scanner sc = new Scanner(System.in);while(sc.hasNext()){String message = sc.next();channel.basicPublish(exchange_name, "error", null, message.getBytes("UTF-8"));System.out.println("生产者发送消息:" + message);}}
}
- 接收消息
public class ReceiveLogsTopic01 {public static final String EXCHANGE_NAME = "direct_logs";public static final String QUEUE_NAME = "console";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtils.getChannel();channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);channel.queueDeclare(QUEUE_NAME, false, false, false, null);channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "info");channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "warning");DeliverCallback deliverCallback = (consumerTag, message) -> {System.out.println("ReceiveLogsTopic01接收到的消息:" + new String(message.getBody(), "UTF-8"));};channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});}
}
- 结果

消息通过 Direct 交换机路由到对应队列:

Direct Exchange Example


二、主题交换机(Topic Exchange)

1. 介绍

Topic 交换机是基于通配符进行路由的交换机。它允许队列绑定的 Routing Key 使用 *(匹配一个词)和 #(匹配零个或多个词)作为通配符。它适用于需要模糊匹配的场景,例如日志系统。

2. 代码示例
- 发送消息
public class EmitLog {public static final String exchange_name = "topic_logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtils.getChannel();Map<String, String> bindingKeyMap = new HashMap<>();bindingKeyMap.put("quick.orange.rabbit", "被队列 Q1Q2 接收到");bindingKeyMap.put("lazy.orange.elephant", "被队列 Q1Q2 接收到");bindingKeyMap.put("quick.orange.fox", "被队列 Q1 接收到");bindingKeyMap.put("lazy.brown.fox", "被队列 Q2 接收到");bindingKeyMap.put("lazy.pink.rabbit", "虽然满足两个绑定但只被队列 Q2 接收一次");for (Map.Entry<String, String> entry : bindingKeyMap.entrySet()) {String key = entry.getKey();String message = entry.getValue();channel.basicPublish(exchange_name, key, null, message.getBytes("UTF-8"));System.out.println("生产者发出消息:" + message);}}
}
- 接收消息
public class ReceiveLogsTopic01 {public static final String exchange_name = "topic_logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtils.getChannel();channel.exchangeDeclare(exchange_name, "topic");String queue_name = "Q1";channel.queueDeclare(queue_name, false, false, false, null);channel.queueBind(queue_name, exchange_name, "*.orange.*");DeliverCallback deliverCallback = (consumerTag, message) -> {System.out.println("接收到的消息:" + new String(message.getBody(), "UTF-8"));System.out.println("接收队列:" + queue_name + "  绑定键:" + message.getEnvelope().getRoutingKey());};channel.basicConsume(queue_name, true, deliverCallback, consumerTag -> {});}
}

三、扇出交换机(Fanout Exchange)

1. 介绍

Fanout 交换机是最简单的交换机类型,它会将消息广播给所有与之绑定的队列,而不考虑消息的 Routing Key。通常用于广播消息,比如多服务实例之间的消息同步。

2. 代码示例
- 发送消息
public class EmitLog {public static final String exchange_name = "logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtils.getChannel();channel.exchangeDeclare(exchange_name, "fanout");Scanner sc = new Scanner(System.in);while(sc.hasNext()){String message = sc.next();channel.basicPublish(exchange_name, "", null, message.getBytes());System.out.println("生产者发送消息:" + message);}}
}
- 接收消息
public class ReceiveLog01 {public static final String exchange_name = "logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtils.getChannel();channel.exchangeDeclare(exchange_name, "fanout");String queueName = channel.queueDeclare().getQueue();channel.queueBind(queueName, exchange_name, "");DeliverCallback deliverCallback = (consumerTag, message) -> {System.out.println("接收到的消息:" + new String(message.getBody(), "UTF-8"));};channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {});}
}

小结

  • Direct Exchange:消息通过精确匹配的 Routing Key 路由到绑定的队列。
  • Topic Exchange:消息通过通配符匹配的 Routing Key 路由到队列,适用于模糊匹配场景。
  • Fanout Exchange:消息会被广播给所有与之绑定的队列,不考虑 Routing Key,适用于广播场景。

http://www.ppmy.cn/embedded/129317.html

相关文章

4.建造者模式

对于建造者模式而已&#xff0c;它主要是将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。适用于那些产品对象的内部结构比较复杂。 建造者模式将复杂产品的构建过程封装分解在不同的方法中&#xff0c;使得创建过程非常清晰&#xff0c;能够…

docker 数据管理,数据持久化详解 二 数据卷容器

数据卷和数据卷容器核心区别 持久性对比 数据卷&#xff1a;当您直接在启动容器时指定了一个数据卷&#xff08;例如&#xff0c;使用docker run -v /data&#xff09;&#xff0c;这个数据卷会自动创建&#xff0c;并且其内容会在容器停止或删除后继续存在。您可以随时通过Do…

【嵌入式软件-STM32】STM32外设

目录 一、LED和蜂鸣器 简介 硬件电路 GPIO口驱动LED电路 如何选择高低电平驱动 蜂鸣器电路 二、面包板 金属爪 排列规则 连接关系 例图 一、LED和蜂鸣器 简介 LED&#xff1a;发光二极管&#xff0c;正向通电点亮&#xff0c;反向通电不亮 有源蜂鸣器&#xff1a;内…

网络安全基础知识点_网络安全知识基础知识篇

文章目录 一、网络安全概述1.1 定义1.2 信息安全特性1.3 网络安全的威胁1.4 网络安全的特征 二、入侵方式2.1 黑客2.1.1 入侵方法2.1.2 系统的威胁2.2 IP欺骗与防范2.2.1 TCP等IP欺骗基础知识2.2.2 IP欺骗可行的原因2.2.3 IP欺骗过程2.2.4 IP欺骗原理2.2.5 IP欺骗防范2.3 Sniff…

现今 CSS3 最强二维布局系统 Grid 网格布局

深入学习 CSS3 目前最强大的布局系统 Grid 网格布局 Grid 网格布局的基本认识 Grid 网格布局: Grid 布局是一个基于网格的二位布局系统&#xff0c;是目前 CSS 最强的布局系统&#xff0c;它可以同时对列和行进行处理&#xff08;它将网页划分成一个个网格&#xff0c;可以任…

【SpringCloud】04-Gateway网关登录校验

1. 网关请求处理流程 2. 网关过滤器 3. 网关实现登录校验 Component // 参数构造器 RequiredArgsConstructor public class AuthGlobalFilter implements GlobalFilter, Ordered {private final AuthProperties authProperties;private final JwtTool jwtTool;private final A…

基于Springboot+Vue的高校实验室智能管理系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

HDU Problem A

思路&#xff1a;这题只需要预处理前缀乘再加上逆元就可以轻松解决。 代码如下&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long const int mod9973; int sum[100005]{1}; int ksm(int x,int y){int ans1;while(y){if(y&1) ansans…