RabbitMQ工作模式-路由模式
官方文档参考:https://www.rabbitmq.com/tutorials/tutorial-four-python.html

使用direct类型的Exchange,发N条消息并使用不同的routingKey,消费者定义队列并将队列routingKey、Exchange绑定。此时使用direct模式Exchange必须要routingKey完成匹配的情况下消息才会转发到对应的队列中被消费。
样例使用日志分发为样例。即按日志不同的级别,分发到不同的队列。每个队列只处理自己的对应的级别日志。
创建生产者
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.nio.charset.StandardCharsets;
import java.util.concurrent.ThreadLocalRandom;public class Product {private static final String[] LOG_LEVEL = {"ERROR", "WARN", "INFO"};public static void main(String[] args) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setUri("amqp://root:123456@node1:5672/%2f");Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 声明交换机,交换器和消息队列的绑定不需要在这里处理。channel.exchangeDeclare("ex.routing",BuiltinExchangeType.DIRECT,// 持久的标识false,// 自动删除的标识false,// 属性null);for (int i = 0; i < 30; i++) {String level = LOG_LEVEL[ThreadLocalRandom.current().nextInt(0, LOG_LEVEL.length)];String dataMsg = "[" + level + "] 消息发送 :" + i;// 发送消息channel.basicPublish("ex.routing", level, null, dataMsg.getBytes(StandardCharsets.UTF_8));}}
}
创建ERROR的消费者
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.nio.charset.StandardCharsets;public class ErrorConsumer {public static void main(String[] args) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setUri("amqp://root:123456@node1:5672/%2f");Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 声明队列并绑定channel.exchangeDeclare("ex.routing",BuiltinExchangeType.DIRECT,// 持久的标识false,// 自动删除的标识false,// 属性null);// 此也可以声明为临时队列,但是如果消息很重要,不要声明临时队列。channel.queueDeclare("log.error",// 永久false,// 排他false,// 自动删除true,// 属性null);//消费者享有绑定到交换器的权力。channel.queueBind("log.error", "ex.routing", "ERROR");// 通过chanel消费消息channel.basicConsume("log.error",(consumerTag, message) -> {System.out.println("ERROR收到的消息:" + new String(message.getBody(), StandardCharsets.UTF_8));},consumerTag -> {});}
}
创建INFO级的消费者
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.nio.charset.StandardCharsets;public class InfoConsumer {public static void main(String[] args) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setUri("amqp://root:123456@node1:5672/%2f");Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 声明队列并绑定channel.exchangeDeclare("ex.routing",BuiltinExchangeType.DIRECT,// 持久的标识false,// 自动删除的标识true,// 属性null);// 此也可以声明为临时队列,但是如果消息很重要,不要声明临时队列。channel.queueDeclare("log.info",// 永久false,// 排他false,// 自动删除false,// 属性null);//消费者享有绑定到交换器的权力。channel.queueBind("log.info", "ex.routing", "INFO");// 通过chanel消费消息channel.basicConsume("log.info",(consumerTag, message) -> {System.out.println("INFO收到的消息:" + new String(message.getBody(), StandardCharsets.UTF_8));},consumerTag -> {});}
}
创建WARN级别的消息者
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.nio.charset.StandardCharsets;public class WarnConsumer {public static void main(String[] args) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setUri("amqp://root:123456@node1:5672/%2f");Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 声明队列并绑定channel.exchangeDeclare("ex.routing",BuiltinExchangeType.DIRECT,// 持久的标识false,// 自动删除的标识false,// 属性null);// 此也可以声明为临时队列,但是如果消息很重要,不要声明临时队列。channel.queueDeclare("log.warn",// 永久false,// 排他false,// 自动删除true,// 属性null);//消费者享有绑定到交换器的权力。channel.queueBind("log.warn", "ex.routing", "WARN");// 通过chanel消费消息channel.basicConsume("log.warn",(consumerTag, message) -> {System.out.println("warn收到的消息:" + new String(message.getBody(), StandardCharsets.UTF_8));},consumerTag -> {});}
}
首先启动三个消费者:
查看队列及交换机情况
[root@nullnull-os ~]# rabbitmqctl list_exchanges --formatter pretty_table
Listing exchanges for vhost / ...
┌────────────────────┬─────────┐
│ name │ type │
├────────────────────┼─────────┤
│ amq.fanout │ fanout │
├────────────────────┼─────────┤
│ amq.rabbitmq.trace │ topic │
├────────────────────┼─────────┤
│ amq.headers │ headers │
├────────────────────┼─────────┤
│ amq.topic │ topic │
├────────────────────┼─────────┤
│ amq.direct │ direct │
├────────────────────┼─────────┤
│ │ direct │
├────────────────────┼─────────┤
│ ex.routing │ direct │
├────────────────────┼─────────┤
│ amq.match │ headers │
└────────────────────┴─────────┘
[root@nullnull-os ~]# rabbitmqctl list_bindings --formatter pretty_table
Listing bindings for vhost /...
┌─────────────┬─────────────┬──────────────────┬──────────────────┬─────────────┬───────────┐
│ source_name │ source_kind │ destination_name │ destination_kind │ routing_key │ arguments │
├─────────────┼─────────────┼──────────────────┼──────────────────┼─────────────┼───────────┤
│ │ exchange │ log.info │ queue │ log.info │ │
├─────────────┼─────────────┼──────────────────┼──────────────────┼─────────────┼───────────┤
│ │ exchange │ log.warn │ queue │ log.warn │ │
├─────────────┼─────────────┼──────────────────┼──────────────────┼─────────────┼───────────┤
│ │ exchange │ log.error │ queue │ log.error │ │
├─────────────┼─────────────┼──────────────────┼──────────────────┼─────────────┼───────────┤
│ ex.routing │ exchange │ log.error │ queue │ ERROR │ │
├─────────────┼─────────────┼──────────────────┼──────────────────┼─────────────┼───────────┤
│ ex.routing │ exchange │ log.info │ queue │ INFO │ │
├─────────────┼─────────────┼──────────────────┼──────────────────┼─────────────┼───────────┤
│ ex.routing │ exchange │ log.warn │ queue │ WARN │ │
└─────────────┴─────────────┴──────────────────┴──────────────────┴─────────────┴───────────┘
[root@nullnull-os ~]#
可以发现,交换器ex.routing 绑定了三个队列log.error、log.info 、log.warn并指定了路由键。
启动消费者,查看消息通否被正常消费。
ERROR的消费者控制台输出
ERROR收到的消息:[ERROR] 消息发送 :1
ERROR收到的消息:[ERROR] 消息发送 :2
ERROR收到的消息:[ERROR] 消息发送 :6
ERROR收到的消息:[ERROR] 消息发送 :8
ERROR收到的消息:[ERROR] 消息发送 :9
ERROR收到的消息:[ERROR] 消息发送 :11
ERROR收到的消息:[ERROR] 消息发送 :15
ERROR收到的消息:[ERROR] 消息发送 :16
ERROR收到的消息:[ERROR] 消息发送 :19
ERROR收到的消息:[ERROR] 消息发送 :20
ERROR收到的消息:[ERROR] 消息发送 :21
ERROR收到的消息:[ERROR] 消息发送 :23
ERROR收到的消息:[ERROR] 消息发送 :24
ERROR收到的消息:[ERROR] 消息发送 :27
ERROR收到的消息:[ERROR] 消息发送 :28
INFO的消费者控制台输出:
INFO收到的消息:[INFO] 消息发送 :0
INFO收到的消息:[INFO] 消息发送 :3
INFO收到的消息:[INFO] 消息发送 :4
INFO收到的消息:[INFO] 消息发送 :13
INFO收到的消息:[INFO] 消息发送 :14
INFO收到的消息:[INFO] 消息发送 :22
INFO收到的消息:[INFO] 消息发送 :25
WARN的消费都控制台输出:
warn收到的消息:[WARN] 消息发送 :5
warn收到的消息:[WARN] 消息发送 :7
warn收到的消息:[WARN] 消息发送 :10
warn收到的消息:[WARN] 消息发送 :12
warn收到的消息:[WARN] 消息发送 :17
warn收到的消息:[WARN] 消息发送 :18
warn收到的消息:[WARN] 消息发送 :26
warn收到的消息:[WARN] 消息发送 :29
至此,验证已经完成。
相关文章:
RabbitMQ工作模式-路由模式
官方文档参考:https://www.rabbitmq.com/tutorials/tutorial-four-python.html 使用direct类型的Exchange,发N条消息并使用不同的routingKey,消费者定义队列并将队列routingKey、Exchange绑定。此时使用direct模式Exchange必须要routingKey完成匹配的情况下消息才…...
StringIO BytesIO
上一篇中我们介绍了文件的基本读写操作,但是很多时候数据的读写并不一定都是在文件中,我们也可以在内存中读写数据,因此引出我们今天的主要内容,即 StringIO 和 BytesIO,让你学会在内存中进行数据的基本读写操作。 1 …...
通讯录管理系统(个人学习笔记黑马学习)
1、系统需求 通讯录是一个可以记录亲人、好友信息的工具。 本教程主要利用C来实现一个通讯录管理系统系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人显示联系人:显示通讯录中所有联系人信…...
[SpringBoot3]远程访问@HttpExchange
六、远程访问HttpExchange[SpringBoot3] 远程访问是开发的常用技术,一个应用能够访问其他应用的功能。SpringBoot提供了多种远程访问的技术。基于HTTP协议的远程访问是最广泛的。SpringBoot中定义接口提供HTTP服务。生成的代理对象实现此接口,代理对象实…...
Linux安装ntp并使用阿里云配置ntp服务器
安装 NTP 客户端: 打开终端,以 root 权限执行以下命令来安装 NTP 客户端: sudo zypper install ntp 编辑 NTP 配置文件: 使用文本编辑器打开 NTP 的配置文件 /etc/ntp.conf,例如使用 nano 编辑器: sudo v…...
js常用方法总结
1、slice 和 splice slice表示截取,slice(start,end),不改变原数组,返回新数组。 splice表示删除,splice(start,length,item),会改变原数组,从某个位置开始删除多个元素,并可以插入新的元素。…...
在PHP中安装Composer并管理Vue前端依赖包
系列文章目录 文章目录 系列文章目录前言一、安装Composer二、使用Composer管理PHP依赖包三、使用npm管理Vue前端依赖包总结 前言 在开发Web应用程序时,使用Composer来管理PHP的依赖包和Vue前端的依赖包是一种很常见的做法。Composer是PHP的包管理工具,…...
03-前端基础CSS-第一天
01-CSS层叠样式表导读 目标: 能够说出什么是CSS能够使用CSS基础选择器能够设置字体样式能够设置文本样式能够说出CSS的三种引入方式能够使用Chrome调试工具调试样式 目录: 1.CSS简介2.CSS基础选择器3.CSS字体属性4.CSS文本属性5.CSS引入方式6.综合案…...
多张图片转为pdf怎么弄?
多张图片转为pdf怎么弄?在网络传输过程中,为了避免图片格式文件出现差错,并确保图片的清晰度和色彩不因不同设备而有所改变,常见的做法是将图片转换为PDF格式。然而,当涉及到多张图片时,逐一转换将会变得相…...
jdk新版本特性
JDK8,JDK11,JDK17,JDK21及中间版本主要更新特性_jdk重要版本_ycsdn10的博客-CSDN博客 Java 20 新特性概览 | JavaGuide(Java面试 学习指南)...
进程Start
Linux中的命令解释器和Windows的程序管理器explorer.exe一样地位,都是在用户态下运行的进程 共享变量发生不同进程间的指令交错,就可能会数据出错 进程只作为除CPU之外系统资源的分配单位 CPU的分配单位是线程 每个进程都有自己的独立用户空间 内核空间是OS内核的…...
SpringCloud学习笔记(六)_Ribbon服务调用
Ribbon介绍 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具 Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时、重试等。简单的说,就是…...
系统架构设计师考试论文:论无服务器架构及其应用
近年来,随着信息技术的迅猛发展和应用需求的快速更迭,传统的多层企业应用系统架构面临越来越多的挑战,已经难以适应这种变化。在这一背景下,无服务器架构(ServliessArchitecture)逐渐流行,它强调业务逻辑由事件触发&am…...
linux下安装Mycat
1 官网下载mycat 官方网站: 上海云业网络科技有限公司http://www.mycat.org.cn/ github地址: MyCATApache GitHubMyCATApache has 34 repositories available. Follow their code on GitHub.https://github.com/MyCATApache 2 Mycat安装 1 把MyCat…...
OpenCV(八):图像二值化
目录 1.固定值二值化 2.自适应阈值二值化 3.Android JNI完整代码 1.固定值二值化 固定阈值二值化是OpenCV中一种简单而常用的图像处理技术,用于将图像转换为二值图像。在固定阈值二值化中,像素值根据一个预定义的阈值进行分类,大于阈值的…...
《Flink学习笔记》——第十一章 Flink Table API和 Flink SQL
Table API和SQL是最上层的API,在Flink中这两种API被集成在一起,SQL执行的对象也是Flink中的表(Table),所以我们一般会认为它们是一体的。Flink是批流统一的处理框架,无论是批处理(DataSet API&a…...
电脑提示缺少d3dx9_43.dll的问题及5个解决方法
大家好!今天,我将和大家分享一个电脑提示缺少d3dx9_43.dll的问题及其解决方法。这个问题可能会影响到我们在使用电脑时的一些功能,所以掌握这个解决方法对我们来说是非常有帮助的。 首先,我们来了解一下什么是d3dx9_43.dll。d3dx9…...
Linux stat 命令及示例
介绍 该stat命令打印有关文件和文件系统的详细信息。该工具提供有关所有者是谁、修改日期、访问权限、大小、类型等信息。 该实用程序对于故障排除、在更改文件之前获取有关文件的信息以及例行文件和系统管理任务至关重要。 本文stat通过实际示例解释了有关 Linux 命令的所有…...
06-基础例程6
基础例程6 01、WIFI实验—WebServer 实验介绍 连接路由器上网是我们每天都做的事情,日常生活中只需要知道路由器的账号和密码,就可以使用手机或电脑连接到路由器,然后上网。 连接路由器,将ESP32的IP地址等信息通过shell…...
【附安装包】Eplan2022安装教程
软件下载 软件:Eplan版本:2022语言:简体中文大小:1.52G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.5GHz 内存4G(或更高)下载通道①百度网盘丨64位下载链接:https://pan.baidu.co…...
新手入门指南,五分钟完成Taotoken账号注册与第一个API调用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 新手入门指南,五分钟完成Taotoken账号注册与第一个API调用 对于初次接触大模型API的开发者来说,如何快速上…...
为Claude Code配置Taotoken聚合API密钥与Base地址避免封号风险
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为Claude Code配置Taotoken聚合API密钥与Base地址避免封号风险 在使用Claude Code这类编程助手工具时,开发者有时会遇到…...
三步解锁:开源AI编程工具的免费共享方案
三步解锁:开源AI编程工具的免费共享方案 【免费下载链接】cursor-vip cursor IDE enjoy VIP 项目地址: https://gitcode.com/gh_mirrors/cu/cursor-vip 在当今AI编程工具费用日益高涨的背景下,cursor-vip项目为全球开发者提供了一个创新的解决方案…...
【Midjourney双色调风格终极指南】:20年视觉算法专家亲授3步精准复刻电影级Duotone效果
更多请点击: https://kaifayun.com 第一章:双色调美学的视觉起源与Midjourney适配性解析 双色调(Duotone)并非现代数字设计的发明,其视觉基因可追溯至19世纪的凹版印刷工艺——通过两块独立印版叠加单色油墨…...
别再只写CRUD了!用SpringBoot+MySQL设计一个高并发预约挂号系统,这些架构细节你得知道
高并发预约挂号系统架构实战:SpringBootMySQL核心技术解析 1. 系统架构设计挑战与解决方案 在医疗信息化高速发展的今天,预约挂号系统作为医院服务的"第一窗口",其稳定性与性能直接影响患者就医体验。传统CRUD架构在面对挂号早高峰…...
ShizuTools LookBack功能剖析:无需卸载即可降级应用的原理与实现
ShizuTools LookBack功能剖析:无需卸载即可降级应用的原理与实现 【免费下载链接】ShizuTools Contains many tools to control android system via shizuku. 项目地址: https://gitcode.com/gh_mirrors/sh/ShizuTools ShizuTools LookBack功能是一款创新的A…...
Perplexity词组搭配查询深度解析(工业级语料验证版):基于127万条真实英文语境的搭配强度阈值模型首次公开
更多请点击: https://codechina.net 第一章:Perplexity词组搭配查询深度解析(工业级语料验证版):基于127万条真实英文语境的搭配强度阈值模型首次公开 Perplexity 不仅是语言模型评估的核心指标,更可转化为…...
3个步骤快速定位Windows热键占用者:Hotkey Detective完整实战指南
3个步骤快速定位Windows热键占用者:Hotkey Detective完整实战指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective …...
别再只盯着IoU了!深入浅出聊聊边界框回归:从IoU到Shape-IoU的演进与选择
边界框回归的进化论:从IoU到Shape-IoU的技术跃迁与实战选型 当我们在计算机视觉领域谈论目标检测时,边界框回归就像是一场永不停歇的进化竞赛。从最初的IoU开始,这场竞赛已经经历了GIoU、DIoU、CIoU、SIoU等多个技术迭代,而最新登…...
Python自动化办公:用PyPDF2批量给PDF加密、调整页面顺序,解放你的双手
Python自动化办公实战:用PyPDF2实现PDF批量加密与智能排序 在数字化办公环境中,PDF文件处理已成为行政、财务和法律从业者的日常必修课。当面对数百份合同需要加密保护,或是季度报告需要重新编排页码时,手动操作不仅效率低下&…...
