RabbitMQ 中的交换机学习

news/2024/10/21 21:15:37/

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/news/1540898.html

相关文章

Cocos Creator导出obj文件用于后端寻路

Cocos Creator 3.8.0 用这个扩展插件 【杨宗宝】两年前写的网格工具&#xff0c;今天将它开源了。 - Creator 3.x - Cocos中文社区carlosyzy_extensions_mesh: Cocos Creator 3.x mesh插件&#xff0c;负责网格数据的导出。合并&#xff0c;拆封等一系列操作 (gitee.com) 下…

DB2数据库学习(一)

启动DB2数据步骤 1 切换到用户db2inst1 1. 用户权限 实例用户: DB2 在安装时会为每个数据库实例创建一个专用的操作系统用户&#xff08;如 db2inst1&#xff09;。这个用户拥有管理该实例所需的特定权限。 安全性: 通过限制数据库实例的管理操作&#xff08;如启动和停止&…

二叉树习题其二Java【力扣】【算法学习day.9】

前言 前言 书接上篇文章二叉树习题其一&#xff0c;这篇文章我们将基础拓展 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思…

03 设计模式-创造型模式-单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单个对象被创建…

「漏洞复现」英飞达医学影像存档与通信系统 WebUserLogin.asmx 信息泄露漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

Linux下压缩与解压缩命令大全【详解】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

二叉树算法之二叉树遍历(前序、中序、后序、层次遍历)

二叉树遍历是指按照某种顺序访问二叉树的所有节点。常见的二叉树遍历方式包括前序遍历&#xff08;Preorder Traversal&#xff09;、中序遍历&#xff08;Inorder Traversal&#xff09;、后序遍历&#xff08;Postorder Traversal&#xff09;和层次遍历&#xff08;Level-or…

Vue前端预览docx文档

Vue前端预览docx文档 实现效果 vue代码 <el-dialog title"预览" :visible.sync"filePreview"><div ref"file"></div></el-dialog>引入依赖文件 官方文档地址 https://www.npmjs.com/package/docx-preview?activeTabre…