深入学习RabbitMQ的Direct Exchange(直连交换机)
RabbitMQ作为一种高性能的消息中间件,在分布式系统中扮演着重要角色。它提供了多种消息传递模式,其中Direct Exchange(直连交换机)是最基础且常用的一种。本文将深入介绍Direct Exchange的原理、应用场景、配置方法以及实践案例,帮助读者更好地理解和使用这一消息传递模式。
一、Direct Exchange的原理
Direct Exchange是RabbitMQ中最简单的消息交换机类型之一。它根据消息的路由键(Routing Key)将消息路由到与之匹配的队列中。每个队列在绑定到交换机时,都会指定一个或多个绑定键(Binding Key)。当消息发送到交换机时,交换机将消息的路由键与所有绑定键进行匹配,并将消息路由到所有匹配成功的队列中。
- 消息发送:生产者将消息发送到Direct Exchange时,需要指定一个路由键。
- 绑定关系:队列与交换机之间的绑定关系是通过绑定键建立的。每个队列可以绑定到多个交换机,每个交换机也可以绑定多个队列。
- 消息路由:交换机根据消息的路由键和队列的绑定键进行匹配,将消息路由到所有匹配成功的队列中。
二、Direct Exchange的应用场景
Direct Exchange适用于需要精确匹配路由键的场景,特别是在一对一或多对一的消息传递中表现出色。以下是一些典型的应用场景:
- 日志处理:根据日志的级别或类型,将日志消息路由到不同的处理队列中。例如,可以将ERROR级别的日志路由到一个错误处理队列,将INFO级别的日志路由到一个信息处理队列。
- 任务分发:在任务分发系统中,可以将不同的任务分配给不同的处理队列,每个队列对应一个或多个消费者。这样可以实现任务的并行处理和负载均衡。
- 订单处理:在电商系统中,根据订单号将订单消息路由到特定的处理队列,以便进行后续的订单处理流程。这可以确保每个订单都被正确地处理和跟踪。
- 消息过滤:在某些情况下,可能需要根据消息的某些属性进行过滤,将符合条件的消息路由到特定的队列中。Direct Exchange可以通过精确匹配路由键来实现这一功能。
三、Direct Exchange的配置方法
在RabbitMQ中配置Direct Exchange通常涉及以下几个步骤:
- 声明交换机:使用RabbitMQ的API或管理界面声明一个Direct Exchange。
- 绑定队列:将队列与Direct Exchange绑定,并指定绑定键。这个绑定键将用于匹配消息的路由键。
- 发送消息:生产者发送消息到Direct Exchange时,需要指定一个路由键。交换机将根据这个路由键来查找与之匹配的队列。
- 接收消息:消费者从绑定的队列中接收消息进行处理。
四、实践案例
以下是一个使用Spring AMQP和RabbitMQ实现Direct Exchange的示例案例。这个案例将展示如何配置交换机、队列、绑定关系以及发送和接收消息。
1. 配置交换机和队列
首先,需要在RabbitMQ中声明一个Direct Exchange和一个或多个队列。这里我们使用Spring AMQP的Java配置方式来实现。
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {public static final String EXCHANGE_NAME = "direct_exchange";public static final String QUEUE_NAME_ONE = "queue_one";public static final String QUEUE_NAME_TWO = "queue_two";public static final String ROUTING_KEY_ONE = "routing_key_one";public static final String ROUTING_KEY_TWO = "routing_key_two";@Beanpublic Queue queueOne() {return new Queue(QUEUE_NAME_ONE, true);}@Beanpublic Queue queueTwo() {return new Queue(QUEUE_NAME_TWO, true);}@Beanpublic DirectExchange directExchange() {return new DirectExchange(EXCHANGE_NAME);}@Beanpublic Binding bindingOne(Queue queueOne, DirectExchange directExchange) {return BindingBuilder.bind(queueOne).to(directExchange).with(ROUTING_KEY_ONE);}@Beanpublic Binding bindingTwo(Queue queueTwo, DirectExchange directExchange) {return BindingBuilder.bind(queueTwo).to(directExchange).with(ROUTING_KEY_TWO);}
}
2. 发送消息
接下来,我们编写一个生产者类来发送消息到Direct Exchange。
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MessageProducer {@Autowiredprivate AmqpTemplate amqpTemplate;public void sendMessage(String routingKey, String message) {amqpTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, routingKey, message);}
}
3. 接收消息
最后,我们编写一个消费者类来接收消息并处理。
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class MessageConsumer {@RabbitListener(queues = RabbitMQConfig.QUEUE_NAME_ONE)public void receiveMessageFromQueueOne(String message) {System.out.println("Received message from queue one: " + message);}@RabbitListener(queues = RabbitMQConfig.QUEUE_NAME_TWO)public void receiveMessageFromQueueTwo(String message) {System.out.println("Received message from queue two: " + message);}
}
4. 运行案例
现在,我们可以运行这个Spring Boot应用程序,并使用MessageProducer来发送消息。例如:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class ApplicationRunner implements CommandLineRunner {@Autowiredprivate MessageProducer messageProducer;@Overridepublic void run(String... args) throws Exception {messageProducer.sendMessage(RabbitMQConfig.ROUTING_KEY_ONE, "Hello, queue one!");messageProducer.sendMessage(RabbitMQConfig.ROUTING_KEY_TWO, "Hello, queue two!");}
}
当应用程序运行时,它会发送两条消息到Direct Exchange。第一条消息将使用routing_key_one
作为路由键,因此将被路由到queue_one
。第二条消息将使用routing_key_two
作为路由键,因此将被路由到queue_two
。消费者类将分别接收并处理这两条消息。
总结
Direct Exchange是RabbitMQ中最简单且常用的消息交换机类型之一。它通过精确匹配路由键将消息路由到与之匹配的队列中。本文深入介绍了Direct Exchange的原理、应用场景、配置方法以及实践案例。通过本文的学习,读者可以更好地理解和使用Direct Exchange来实现消息传递和分发功能。在实际应用中,可以根据具体需求选择合适的消息交换机类型来构建高效、可靠的消息传递系统。
相关文章:
深入学习RabbitMQ的Direct Exchange(直连交换机)
RabbitMQ作为一种高性能的消息中间件,在分布式系统中扮演着重要角色。它提供了多种消息传递模式,其中Direct Exchange(直连交换机)是最基础且常用的一种。本文将深入介绍Direct Exchange的原理、应用场景、配置方法以及实践案例&a…...
客户端 ORA-12537: TNS: 连接已关闭
现象: 1、双节点数据库. 2、客户端连接 db1 正常 3、客户端连接db2 显示:ORA-12537: TNS: 连接已关闭 4、数据库正常启动 5、lsnrctl status 检查 监听正常 6、lsnrctl stop/start 重启监听正常 过程: 冲浪 查看网友的解决方法。 连接&…...
.net开发环境安装配置以及程序发布 详细教程
文章目录 一、安装visual studio1.1推荐win10操作系统1.2推荐vs20221.3选择工作负载 二、新建基于.net的winform应用程序2.1为什么要.net 2.22.2.1 选择Window窗体应用 三、发布.net应用 一、安装visual studio 1.1推荐win10操作系统 1.2推荐vs2022 社区版、专业版、企业版都…...
盛最多水的容器
一、题目 给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i, 0)和(i, height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。也就是求x轴与y轴的面积。 说明:你不能倾…...
spring boot解决swagger中的v2/api-docs泄露漏洞
在配置文件中添加以下配置 #解决/v2/api-docs泄露漏洞 springfox:documentation:swagger-ui:enabled: falseauto-startup: false 处理前: 处理后:...
MySQL和Hive中的行转列、列转行
水善利万物而不争,处众人之所恶,故几于道💦 文章目录 MySQL1.行转列2.列转行 Hive1.行转列2.列转行(1)侧窗(2)union MySQL 1.行转列 把多行转成列。直接group,sum(if()) 2.列转行 Hive 1.行转列 select name,sum(if(kmshuxu…...
【关于 vite 使用plugin-legacy兼容低版本浏览器仍出现的问题的情况】
项目使用了vitevue3ts的方案,采用plugin-legacybabel适配低版本浏览器 在开发工作中,项目使用了vitevue3ts的方案,但是需要适配低版本浏览器。首先使用了vitejs/plugin-legacy插件,配置完成后发现并不能解决问题, 出现…...
【集成学习】Bagging算法详解及代码实现
文章目录 1. Bagging集成学习算法1.1 简介1.2 基本步骤1.3 Bagging优缺点1.4 随机森林:Bagging的一个重要应用1.5 总结 2. Python代码实现3. 如何理解偏差与方差3.1 偏差(Bias)3.2 方差(Variance)3.3 方差与偏差的权衡…...
HTML5实现好看的中秋节网页源码
HTML5实现好看的中秋节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 节日由来界面1.4 节日习俗界面1.5 节日文化界面1.6 节日美食界面1.7 节日故事界面1.8 节日民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看…...
OBS Zoom to Mouse 脚本安装与使用指南
前言:OBS有两个不错的放大插件,经过多台电脑测试发现,唯一好用的就是下面介绍的obs-zoom-to-mouse.lua这个插件,因为它安装简单,不需要python,设置更人性化性价比极高。 zoom_and_follow_mouse.py 这个pyth…...
使用codeblock+wxwidgets做的界面,运行时额外出现了一个cmd窗口
如何不让cmd窗口出现? 定位到Workspace project,选择菜单Project->Properties 将Type从Console application改为GUI application, 然后rebuild 这个project 之后再运行就没有cmd窗口了: 原因是在创建Project的时候选择了console mode application, 可…...
AI眼镜赛马,谁是C位,谁在边缘?
CES2025正在火热开展,智能眼镜成为最受关注的赛道之一。 去年8月,Meta曾一枝独秀引领AI眼镜爆发了一次大行情,带动AI眼镜市场百花齐放,近几个月更是爆发新品潮。 据悉,包括国内的雷神科技、恺英网络投资的乐相科技&a…...
Linux中彻底卸载Oracle 19.25单实例数据库
Linux中彻底卸载Oracle 19.25单实例数据库 1、关闭数据库实例2、关闭数据库监听3、执行deinstall卸载脚本4、删除相关目录5、删除数据库相关的用户和组 1、关闭数据库实例 su - oracle sqlplus / as sysdba shutdown immediate2、关闭数据库监听 su - oracle lsnrctl stop3、…...
分享:osgb倾斜数据转cesium-3dtiles 小工具.
背景: 很多知识殊途同归,在三维软件这块,少不了要和各种各样的数据格式打交道.osgb,stl,obj,3dtiles,3ds等等..虽然里面本质核心基本都是几何数据拓扑数据材质纹理数据等等,但是由于其组织方式不同和特殊的应用场景,导致很多模型需要转来转去...相信很多人在这方面都或多或少吃…...
基于单片机的客车载客状况自动检测系统(论文+源码)
1系统整体设计 本课题为客车载客状况自动检测系统,在此以STM32单片机为核心控制器,结合压力传感器、红外传感器、蜂鸣器、语音提示模块、继电器、液晶等构成整个客车载客状况自动检测系统,整个系统架构如图2.1所示,在此通过两个红…...
Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问
在访问网页的时候,因为浏览器自身的安全设置问题, 对于https的网页访问会出现安全隐私的提示, 甚至无法访问对应的网站,尤其是chrome浏览器, 因此本文主要讲解如何设置chrome浏览器的设置,来解决该问题&…...
中国省级产业结构高级化及合理化数据测算(2000-2023年)
一、数据介绍 数据名称:中国省级产业结构高级化、泰尔指数 数据年份:2000-2023年 数据范围:31个省份 数据来源:中国统计年鉴、国家统计局 数据整理:内含原始版本、线性插值版本、ARIMA填补版本 数据说明…...
云手机 —— 手机矩阵的 “超级外挂
如何打造手机矩阵 打造手机矩阵主要包括以下几个步骤: 1.确定目标与需求:首先,明确打造手机矩阵的目的和需求,是为了进行电商运营、自媒体推广、任务管理还是其他目的。这将决定后续的手机数量、操作系统选择以及应用安装等。 2.选择手机与操作系统:根据…...
Ruby语言的编程范式
Ruby语言的编程范式 在软件开发的世界里,编程语言不仅仅是实现功能的工具,更是一种表达思想和解决问题的方式。Ruby语言凭借其简洁优雅的语法和强大的功能,广受开发者喜爱,并逐步形成了一种独特的编程范式。本文将深入探讨Ruby语…...
【微服务】SpringBoot 整合Redis实现延时任务处理使用详解
目录 一、前言 二、延迟任务的高频使用场景 三、延迟任务常用解决方案 3.1 Quartz 3.2 DelayQueue 3.2.1 Timer + TimerTask 3.2.2 ScheduledExecutorService 3.3 Redis sorted set 3.4 RabbitMQ 四、Redis实现延时队列操作实战 4.1 Redis Sorted Set 概述 4.1.1 Re…...
STM32烧写失败之Contents mismatch at: 0800005CH (Flash=FFH Required=29H) !
一)问题:用ULINK2给STM32F103C8T6下载程序,下载方式设置如下: 出现下面两个问题: 1)下载问题界面如下: 这个错误的信息大概可以理解为,在0x08000063地址上读取到flash存储为FF&am…...
图像分割综述
1. 简述 图像分割(Image Segmentation)是计算机视觉领域中的一项基本任务,旨在将图像划分为多个具有语义或视觉意义的区域。这项任务在医学影像分析、自动驾驶、遥感图像处理、视频监控等领域都有着广泛的应用。随着深度学习技术的发展&…...
计算机毕业设计hadoop+spark知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
STM32-笔记38-I2C-oled实验
一、什么是I2C? I2C总线,全称Inter-Integrated Circuit(互连集成电路),是一种由Philips(现NXP半导体)公司在1980年代初开发的同步 串行 半双工通信总线。 二、有了串口通信为什么要使用I2C&…...
Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)
Vue Amazing UI 一个 Vue 3 组件库 使用 TypeScript,都是单文件组件 (SFC),支持 tree shaking 有点意思 English | 中文 Vue Amazing UI 是一个基于 Vue 3、TypeScript、Vite 等最新技术栈开发构建的现代化组件库,包含丰富的 UI 组件和常…...
Android NDK开发实战之环境搭建篇(so库,Gemini ai)
文章流程 音视频安卓开发首先涉及到ffmpeg编译打包动态库,先了解动态库之间的cpu架构差异性。然后再搭建可运行的Android 环境。 So库适配 ⽇常开发我们经常会使⽤到第三库,涉及到底层的语⾳,视频等都需要添加so库。⽽so库的体积⼀般来说 ⾮…...
Word中所有的通配符使用方式[Word如何批量删除中文标点符号,英文标点符号,英文字母符号,数字符号,中文汉字符号]
Word中所有的通配符使用方式 概念讲解通配符一览表详细介绍通配符的使用使用通配符搜索简洁通配符链接操作演示链接 概念讲解 Word中的通配符是用在查找和替换中的正则表达式。通配符可以实现高级的查找替换,快速整理和排版文档。常用的通配符包括: “*…...
ElasticSearch内存占用率过高怎么办?
文章目录 1,先用top看看各个进程的内存占用情况2,不能简单的杀死进程,然后再重启。3,查看一下ElasticSearch进程的具体启动情况4,修改Elasticsearch 的Java堆内存 1,先用top看看各个进程的内存占用情况 先…...
svelte5中使用react组件
在svelet5中导入并使用react组件库 svelte5中使用react组件 svelte5中使用react组件 在svelet5中导入并使用react组件库, 示例项目地址:https://github.com/shenshouer/my-svelte-react 在svelte5中当前还有问题,无法将children传递到react中渲染 使用…...
Linux 文件的特殊权限—ACL项目练习
本文为Ubuntu Linux操作系统- 第二十一期~~ 上期回顾: 【ACL权限控制详解】 更多Linux 相关内容请点击👉【Linux专栏】~ 主页:【练小杰的CSDN】 文章目录 项目项目要求具体的设置命令如下问题2问题3第一步:设置默认ACL前,在projec…...
游戏引擎学习第76天
确保一切正常并计划今天的内容 在本次开发中,我们正在集中精力处理引擎中的三维功能,尤其是如何有效地处理多层结构,比如在多个楼层之间行走,或者在房间上方可以看到下方的房间。我们的目标是避免使用临时解决方案或黑客方式&…...
【Linux-多线程】POSIX信号量-基于环形队列生产消费模型
POSIX信号量 POSIX信号量和System V信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源的目的。但POSIX可以用于线程间同步 1.快速认识信号量接口 POSIX信号量分为两种类型: 命名信号量(Named Semaphores)&…...
电脑32位和64位之区别(Difference between 32-Bit and 64 Bit Computers)
电脑32位和64位之区别 很多小伙伴还不知道电脑32位和64位是什么意思,今天小编就来普及一下。 32位和64位是指电脑处理器(CPU)和操作系统的架构,决定了电脑如何处理数据、存储信息、运行程序等。 32位和64位是指电脑系统中每个处…...
1688平台商品关键词搜索的多样性与Python爬虫应用实践
在当今这个信息化、数字化飞速发展的时代,电子商务平台已经成为人们日常生活中不可或缺的一部分。而1688作为国内知名的B2B电商平台,凭借其庞大的商品种类和丰富的供应链资源,为无数商家和消费者提供了便捷的交易渠道。除了广受关注的女装品类…...
2025年:AI化浪潮中的社会变迁与商业革新
随着人工智能(AI)技术的迅猛发展,2025年将成为一个转折点。这一年,AI不仅将深入到日常生活和商业运营的各个角落,还将引发一系列深刻的社会、经济和技术变革。以下是对未来一年可能出现的“AI化”现象的预测与展望。 AI进入主流文化的标志 超级碗广告:在2025年的超级碗上…...
JS scrollIntoView 技巧揭秘:解锁网页流畅交互
文章目录 一.基本概念二.语法和参数基本语法:element.scrollIntoView();参数详解: 三.应用场景和示例场景一:点击目录点位到相应的位置React 示例代码:Vue3 示例代码: 场景二:轮播图定位到指定图片示例代码…...
精选2款.NET开源的博客系统
前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台,今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统,后端基于最新的.Net6和Asp.Net Core框架,遵循RESTFul接口规范&…...
1.CSS的复合选择器
1.1 什么是复合选择器 在CSS中,可以根据选择器的类型把选择器分为基础选择器和复合选择器,复合选择器是建立在基础选择器之上,对基础选择器进行组合形成的。 复合选择器可以更精准、更高效的选择目标元素(标签) 复…...
sys.dm_exec_connections:查询与 SQL Server 实例建立的连接有关的信息以及每个连接的详细信息(客户端ip)
文章目录 引言I 基于dm_exec_connections查询客户端ip权限物理联接时间范围dm_exec_connections表see also: 监视SQL Server 内存使用量资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)引言 查询历史数据库客户端ip应用场景: 安全分析缺乏…...
gitee 使用教程
前言 Gitee 是一个中国的开源代码托管平台,类似于 GitHub,旨在为开发者提供一个高效、稳定、安全的代码管理和协作开发环境。Gitee 支持 Git 协议,可以托管 Git 仓库,进行版本控制、代码协作、项目管理等操作。 1. Gitee 的主要…...
HTMLHTML5革命:构建现代网页的终极指南 - 0. 课程目录设计
结构清晰,层层递进 课程从基础知识(如HTML学前必知)开始,逐步深入到高级应用(如PWA配置和WebApp优化)。每个模块都有明确的目标,适合零基础学员逐步掌握HTML。 覆盖范围广 这套课程涵盖了HTM…...
嵌入式系统 (2.嵌入式硬件系统基础)
2.嵌入式硬件系统基础 2.1嵌入式硬件系统的组成 嵌入式硬件系统以嵌入式微处理器为核心,主要由嵌入式微处理器、总线、存储器、输入/输出接口和设备组成。 嵌入式微处理器 嵌入式微处理器采用冯诺依曼结构或哈佛结构:前者指令和数据共享同一存储空间…...
Vue3轮播图的实现:vue3-carousel的使用和配置
vue3-carousel 是一个用于 Vue 3 的轻量级、响应式、功能强大的轮播组件。它允许你轻松创建可以滚动的图片或内容滑块。下面是关于如何安装、使用以及配置 vue3-carousel 的一些示例和详细说明。 目录 一、安装 vue3-carousel 二、引入 三、轮播全局样式修改 一、安装 vue3-…...
Spring AI ectorStore
Spring AI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中扮演着至关重要的角色。以下是对Spring AI VectorStore的详细解析: 一、VectorStore的基本概念 定义:VectorStore特别适用于处理那些经过嵌入…...
uniapp vue2版本如何设置i18n
如何设置i18n在该软件设置过语言的情况下优先选择所设置语言,在没有设置的情况下,获取本系统默认语言就,将系统默认语言设置为当前选择语言。 1、下载依赖: npm install vue-i18n --save 2、创建相关文件(在最外层&…...
【2024华为OD-E卷-100分-boss的收入】(题目+思路+JavaC++Python解析)
题目描述 题目:boss的收入 在一个公司中,有一个老板(boss)和若干名员工(employees)。老板和员工的收入信息存储在一个数组中,其中数组的每个元素表示一个人的收入。数组的第0个元素表示老板的…...
若依 ruoyi-vue HandlerInterceptor 拦截器 文件接口自定义权限
文件资源添加自定义权限 package com.huida.framework.config;import com.huida.framework.interceptor.FileInterceptor; import com.huida.framework.interceptor.RequestInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springfr…...
在离线环境中安装 `.rpm` 包的步骤
在一些环境中,可能无法直接通过网络安装软件包。特别是在没有互联网连接的情况下,我们仍然可以手动下载 .rpm 安装包并进行离线安装。本文将介绍如何在离线环境中安装多个 .rpm 包,确保软件的顺利安装和依赖关系的处理。 1. 将 .rpm 文件复制…...
Python----Python爬虫(selenium的使用,定位元素,层级定位)
一、介绍与安装 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器。 Sele…...
Docker 服务、镜像、容器之命令(Docker Services, Images, and Container Commands)
Docker 服务、镜像、容器之命令 Docker是一个强大的容器化平台,能够帮助开发者高效地构建、部署和管理应用程序。本文将详细介绍Docker的服务命令、镜像命令和容器命令,帮助你快速上手Docker。 一、Docker的服务相关命令 在使用Docker之前,…...