当前位置: 首页 > article >正文

RabbitMQ—消息元数据解析指南

本文介绍了RabbitMQ的Java客户端实现包含生产者和消费者代码示例。生产者通过建立连接、创建信道、声明队列循环发送10条消息到hello队列消费者同样建立连接后订阅该队列通过DefaultConsumer接收并打印消息。文章重点解析了RabbitMQ的两个核心元数据Envelope包含投递标签、重投标志、交换机和路由键信息和AMQP.BasicProperties消息属性头如内容类型、优先级等详细说明了各参数含义及实际应用场景。这些元数据对消息路由、业务追踪和RPC通信等高级功能至关重要。⽣产者代码package rabbitmq.simple; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import java.io.IOException; import java.util.concurrent.TimeoutException; public class ProducerDemo { public static void main(String[] args) throws IOException, TimeoutException { //1. 建立连接 ConnectionFactory connectionFactory new ConnectionFactory(); connectionFactory.setHost(自己的服务器地址); connectionFactory.setPort(5672); //需要提前开放端口号 connectionFactory.setUsername(账号名字);//账号 connectionFactory.setPassword(密码); //密码 connectionFactory.setVirtualHost(主机名); //虚拟主机 Connection connection connectionFactory.newConnection(); //2. 开启信道 Channel channel connection.createChannel(); //3. 声明交换机 使用内置的交换机 //4. 声明队列 /** * queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, * MapString, Object arguments) * 参数说明: * queue: 队列名称 * durable: 可持久化 * exclusive: 是否独占 * autoDelete: 是否自动删除 * arguments: 参数 */ channel.queueDeclare(hello, true, false, false, null); //5. 发送消息 /** * basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) * 参数说明: * exchange: 交换机名称 * routingKey: 内置交换机, routingkey和队列名称保持一致 * props: 属性配置 * body: 消息 */ for (int i 0; i 10; i) { String msg hello rabbitmq~i; channel.basicPublish(,hello, null, msg.getBytes()); } System.out.println(消息发送成功~); //6. 资源释放 channel.close(); connection.close(); } }消费者代码package rabbitmq.simple; import com.rabbitmq.client.*; import java.io.IOException; import java.util.concurrent.TimeoutException; public class ConsumerDemo { public static void main(String[] args) throws IOException, TimeoutException, InterruptedException { //1. 创建连接 ConnectionFactory connectionFactory new ConnectionFactory(); connectionFactory.setHost(自己的服务器地址); connectionFactory.setPort(5672); //需要提前开放端口号 connectionFactory.setUsername(账号名字);//账号 connectionFactory.setPassword(密码); //密码 connectionFactory.setVirtualHost(主机名); //虚拟主机 Connection connection connectionFactory.newConnection(); //2. 创建Channel Channel channel connection.createChannel(); //3. 声明队列(可以省略) channel.queueDeclare(hello,true, false, false, null); //4. 消费消息 /** * basicConsume(String queue, boolean autoAck, Consumer callback) * 参数说明: * queue: 队列名称 * autoAck: 是否自动确认 * callback: 接收到消息后, 执行的逻辑 */ DefaultConsumer consumer new DefaultConsumer(channel){ //从队列中收到消息, 就会执行的方法 Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println(接收到消息: new String(body)); // System.out.println(接收到消息: consumerTag); // System.out.println(接收到消息: (String.valueOf(envelope))); // System.out.println(接收到消息: properties ); } }; channel.basicConsume(hello, true, consumer); //等待程序执行完成 Thread.sleep(2000); //5. 释放资源 channel.close(); connection.close(); } }接收到消息:hello rabbitmq~9接收到消息:amq.ctag-eK9h2CCuGOsETN7QBqO2xw接收到消息:Envelope(deliveryTag10, redeliverfalse, exchange, routingKeyhello)接收到消息:#contentHeaderbasic(content-typenull, content-encodingnull, headersnull, delivery-modenull, prioritynull, correlation-idnull, reply-tonull, expirationnull, message-idnull, timestampnull, typenull, user-idnull, app-idnull, cluster-idnull)RabbitMQ 消息元数据详解本文档详细介绍了 RabbitMQ 中两个核心的元数据对象Envelope物流信息和AMQP.BasicProperties消息属性头。一、Envelope信封对象Envelope包含了 RabbitMQ 消息的“物流信息”用于追踪消息的投递状态和路径。参数值含义解释deliveryTag10消息编号这是第 10 条投递给你的消息。就像快递单号用于确认收货ACK。redeliverfalse是否重投false 这是第一次投递给你true 这条消息之前给过别的消费者或之前给你但你没确认现在重新投递exchange空交换机名称空字符串表示使用的是内置默认交换机AMQP default。生产者代码里basicPublish(, hello, ...)第一个参数就是空字符串。routingKeyhello路由键决定消息要送到哪个队列。在简单模式下routingKey通常等于队列名hello。就像写地址“送到 hello 队列”。 详细解读1. deliveryTag 10作用RabbitMQ 给这条消息打的序号从 1 开始累加。应用场景当你使用手动确认autoAckfalse时需要用这个编号告诉服务器“第 10 条消息我处理完了可以删了”。// 手动确认示例 channel.basicAck(envelope.getDeliveryTag(), false);2. redeliver false意味着什么这条消息是“新鲜”的第一次发给你。如果为 true说明这条消息被“退件重发”了。可能原因之前的消费者处理超时/崩溃没有发送确认ACK。RabbitMQ 把消息重新发给其他消费者或再次发给你。3. exchange 空字符串表示默认交换机Default Exchange。这是 RabbitMQ 内置的直连交换机direct exchange。规则routingKey必须完全匹配队列名才能路由。4. routingKey hello路由键决定消息走哪条路。在默认交换机下routingKey 队列名。生产者代码里basicPublish(, hello, ...)的第二个参数hello就是routingKey。 一句话总结Envelope就是消息的“快递面单”告诉你这是第 10 个包裹deliveryTag10是第一次派送redeliverfalse从默认站点发出exchange目的地是 hello 队列routingKeyhello。而真正的“包裹内容”在body字节数组里二、AMQP.BasicProperties消息属性头AMQP.BasicProperties包含了消息的元数据信息关于消息的数据而非消息本身内容。如果在发送消息时第 3 个参数传了nullchannel.basicPublish(, hello, null, msg.getBytes());那么这些属性都会是空的null。 每个参数详解参数名当前值含义实际应用场景content-typenull内容类型MIME类型如application/json、text/plain。消费者收到后知道用什么格式解析content-encodingnull内容编码如gzip压缩、UTF-8。告诉消费者如何解码headersnull自定义头信息Map类型存自定义键值对用于业务路由或过滤delivery-modenull投递模式1非持久化重启丢失2持久化存磁盘重启还在prioritynull优先级数字越大越优先0-9。VIP客户的消息插队处理correlation-idnull关联ID用于 RPC 模式。客户端发请求时带个唯一ID服务端回复时带同样IDreply-tonull回复队列名RPC场景中告诉服务端“处理完后把结果发到这个队列”expirationnull过期时间毫秒如60000表示 1 分钟后若还没被消费自动删除message-idnull消息唯一ID业务层面的消息编号用于幂等性防止重复消费timestampnull时间戳消息发送时间用于日志追踪或延时计算typenull消息类型业务类型标识如order.created、user.registereduser-idnull发送者ID验证消息发送者的身份app-idnull应用ID标识哪个应用发送的如order-servicecluster-idnull集群ID已废弃基本不用 实际使用示例场景 1发送 JSON 数据 自定义业务头// 生产者 AMQP.BasicProperties props new AMQP.BasicProperties.Builder() .contentType(application/json) // 内容是 JSON .deliveryMode(2) // 持久化消息重启不丢 .priority(5) // 优先级 5较高 .messageId(ORDER-20240315-001) // 业务消息ID .expiration(300000) // 5 分钟后过期 .headers(Map.of(userId, 1001, // 自定义头 orderType, vip)) .build(); channel.basicPublish(, hello, props, jsonBytes);场景 2消费者读取这些属性Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) { // 1. 判断内容类型 if (application/json.equals(properties.getContentType())) { // 按 JSON 解析 } // 2. 获取业务 ID幂等性校验 String msgId properties.getMessageId(); // 3. 获取自定义头 MapString, Object headers properties.getHeaders(); if (headers ! null) { String orderType (String) headers.get(orderType); } } 总结这些属性都是消息的“标签”主要用于路由决策headers、type消息特性priority、expiration、delivery-mode业务追踪message-id、correlation-id、timestampRPC 通信reply-to、correlation-id入门示例传null是因为简单场景不需要高级特性但在分布式微服务系统中这些属性至关重要

相关文章:

RabbitMQ—消息元数据解析指南

本文介绍了RabbitMQ的Java客户端实现,包含生产者和消费者代码示例。生产者通过建立连接、创建信道、声明队列,循环发送10条消息到"hello"队列;消费者同样建立连接后订阅该队列,通过DefaultConsumer接收并打印消息。文章…...

【UE】【BP】在蓝图中Key关卡序列

以前都是处理资产标准化,遍历材质和相关param和refrence相关就可以,第一次接触Seq,还挺有意思。 但是因为后续多半是使用As来编写逻辑了,不会使用蓝图了,所以这个文档多半不会再更新。 学习思路和实际上的实现逻辑是接…...

VMware 17 安装 RHEL 8

1、准备工作:VMware 17 exe安装包 RHEL 8 iso镜像文件2、博通官网下载VMware并安装3、创建新的虚拟机选择稍后安装操作系统,在后面选择Linux 并选择RHEL 8 64bit根据自己电脑配置设置好虚拟机配置,虚拟机所需20g,在选择完之后…...

Python 100例:编程实践与技巧解析

Python 100例:编程实践与技巧解析 引言 Python作为一种广泛使用的编程语言,以其简洁的语法和强大的库支持在各个领域都得到了广泛应用。为了帮助读者更好地掌握Python编程,本文将为您精选100个Python编程实例,涵盖基础语法、数据结…...

文本转音频网站

Free Text to Speech TTS Converter | Read Aloud Text to MP3...

征程 6X Camera 接入数据评估

1.接入带宽计算 1.1 Camera 接入时,需评估链路上各模块之间的理论要求和限制,接入通路一般涉及加解串器,MIPI,CIM, ISP(RAW),PYM,GDC/STITCH(可选&#xff09…...

一种半自动交通标注的混合框架:将 YOLOv11 目标检测与 CLIP 语义验证相结合

原文地址,本文仅作翻译学习使用,如遇侵权,请联系本人删除 Original content. This article is only for translation learning purposes. If there is any infringement, please contact me to delete it. A Hybrid Framework for Semi-Aut…...

B端拓客核验难题:精准度与成本,到底该怎么平衡?氪迹科技法人号码核验工具

做B端客户拓展的团队,几乎都绕不开一个核心环节——企业法人、股东、核心决策人号码的核验与筛选。人工手筛耗时费力,根本无法规模化;可依赖工具,又常常陷入两难困境。做B端拓客,仿佛总要面临二选一:要么被…...

新西伯利亚大学推出“Pisets“:让机器写字员听懂每一句话

这项由新西伯利亚州立大学与西伯利亚神经网络有限公司合作完成的研究发表于2026年1月26日,论文编号为arXiv:2601.18415v1。有兴趣深入了解的读者可以通过该编号查询完整论文。研究团队开发了一款名为"Pisets"的语音识别系统,这个名字来源于古罗…...

2024提示工程架构师趋势:自主代理AI的7个革命性提示策略

2024自主代理AI爆发:提示工程架构师必须掌握的7个革命性策略 一、引言:从“被动回答”到“主动解决”,提示工程的下一个战场 2023年,我们聊提示工程时,核心是“如何让AI更精准地回答问题”;2024年,当**自主代理AI(Autonomous AI Agents)**从实验室走进生产场景——比…...

上海交大首创PlanViz:计算机使用任务中的智能图像生成新基准

这项由上海交通大学、复旦大学和华为技术有限公司联合开展的研究发表于2026年2月的arXiv预印本,论文编号为arXiv:2602.06663v1。有兴趣深入了解的读者可以通过该编号查询完整论文。 在我们日常使用电脑和手机的过程中,经常需要处理各种视觉任务&#xff…...

QT 事件驱动架构

很多大型系统(工业软件、机器人系统、自动驾驶、复杂 Qt 应用)在规模变大以后,都会逐渐引入 事件驱动架构(Event Bus / Event Driven Architecture)。 原因很简单:当系统模块越来越多时,模块之间…...

大数据领域数据预处理的重要性及实施策略

大数据领域数据预处理的重要性及实施策略 关键词:大数据、数据预处理、数据清洗、数据集成、数据转换、数据归约、实施策略 摘要:本文深入探讨大数据领域中数据预处理的重要性,通过形象的比喻和实际案例,阐述数据清洗、集成、转换、归约等核心概念及其相互关系。同时,借助…...

物理常识,原来世界是这样的。

宇宙 & 相对论类1. 任何有质量的物体都不可能达到光速,只能无限接近。 2. 速度越快,时间越慢。你跑起来的时候,时间真的比站着的人过得慢一点点。 3. 引力本质不是“拉力”,而是质量把时空压弯了,物体只是沿着弯曲…...

TR-069/TR-369 项目框架实施总结

TR-069/TR-369 项目框架实施总结 📋 实施概览 已成功搭建 TR-069 CWMP 和 TR-369 USP 协议的项目框架,完成 P0 优先级的核心类实现。 ✅ 已完成工作 1. 项目结构搭建 1.1 模块划分 ✅ yudao-module-iot-tr069 - TR-069 CWMP 协议模块 ✅ yudao-module-iot-tr369 - TR-3…...

基于Python的教学辅助系统设计与实现毕业设计源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一款基于Python的教学辅助系统,旨在提高教学效率、优化教学过程、丰富教学手段,并为学生提供个性化学习体验。具体研…...

【2.19】Gardner环硬件片内测试2——硬件测试和分析

目录 1.学习回顾 2.综合布局布线 3.产生bit文件 4.程序烧写 5.在线波形查看和调试 6.程序硬件调试操作视频 本文介绍了FPGA开发板硬件调试的全流程: 1)回顾前期准备工作; 2)详细讲解综合布局布线步骤及其重要性; 3)说明bit文件的生成与作用; 4)演示程序…...

库存管理,把这4件事做好就够了

目录 第一件事:搞清楚你到底有什么 第二件事:想清楚什么时候买,买多少 第三件事:把东西放在该放的地方 第四件事:定期清理不动销的货 写在最后 之前和一些做企业的朋友聊天,很多人提到库存管理&#x…...

ADS2016如何找到SmithChartMatch

关于我找这个器件找了两周也没找到这件事……终于被我捣鼓出来了。软件:ADS2016前情:我的元件库里无论如何都找不到第一步:Tools→SmithChart第二步:选择Palette第三步:在左边面板里弹出的元件中就可以看到我们需要的S…...

xStocks.fi:DeFi 领域的代币化股票与 ETF 创新

## 前言随着去中心化金融(DeFi)的不断演进,传统金融资产与区块链技术的融合成为新的焦点。xStocks.fi 正是这一趋势的杰出代表,它将全球最受欢迎的美国股票和交易所交易基金(ETF)代币化,引入链上…...

代码筑梦者:数字世界的隐秘建筑师

代码筑梦者:程序员的隐秘世界在数字时代的星河里,有这样一群人——他们的指尖在键盘上飞舞,用0和1编织着世界的另一重维度。程序员,这群现代社会的代码筑梦者,他们的工作早已超越了简单的“写代码”,而是成…...

量化交易系列(八):OKX 搞了个 AI Trade Agent,是普通人的机会还是手续费收割机?

量化交易系列(八):OKX 搞了个 AI Trade Agent,是普通人的机会还是手续费收割机? 导语 2026 年 3 月,OKX 官宣推出 Agent Trade Kit——一款基于 MCP 协议的开源 AI 交易工具集,提供 83 个工具,覆盖行情发现、策略执行、期权交易、算法委托、Bot 策略管理全链路,还内…...

PAT 乙级 1034

本题最关键就是要思路清晰的写函数,函数只是处理,分子和分母,把 分子/分母 写回正确的模式。还有要注意,所有的整数定义都要写 long long,scanf 要写 %lld,在最开始定义 a b 的时候也要这么写,因…...

Win10 -> Win11 升级机制 导致应用不可用

一、问题 我今天刚升级了系统(从win10到win11)现在的问题是:我在vscode,kiro等软件想使用anconda环境,使用conda init命令显示: Unable to create process using H:\myMinAnconda\python.exe H:\myMinAnco…...

Dubbo 核心知识点速记

一、工程结构:为什么要拆三个模块整个项目拆成三个 Maven 子模块,由一个父 POM 聚合管理:dubbo-demo(父工程,packagingpom) ├── dubbo-api → 接口契约层 ├── dubbo-provider → 服务提供者…...

第三篇:从零搭建 Spring Boot 3 + Dubbo 3 + ZooKeeper 微服务实战 -- 消费者 模块

创建 dubbo-consumer 模块&#xff08;服务消费者&#xff09;Consumer 通过 ZooKeeper 发现 Provider&#xff0c;发起 RPC 调用&#xff0c;并通过 REST 接口将结果暴露给前端或外部系统。5.1 pom.xml&#xff0c;与 Provider 模块的依赖基本一致。dubbo-consumer/pom.xml<…...

物联网面试必过要点

要是能熟记以下知识点&#xff0c;再加上自身的项目经验&#xff0c;过个面试&#xff0c;问题不大。指针定义一个指向指针的的指针&#xff0c;它指向的指针是指向一个整型数 int **a; 一个有10个指针的数组&#xff0c;该指针是指向一个整型数的 int *a[10]; 一个指向有10个整…...

完整博文目录

Java 集合 JDK 常用集合类源码阅读 &#x1f31f; 并发 JUC 并发包源码阅读 &#x1f31f;ThreadPoolExecutor 与常用线程池volatile, synchronized 和锁 基础扩展 String 字符串浅析反射机制异常机制 数据库 HBase HBase原理 &#x1f31f; MySQL 事务&#xff0c;隔离…...

第一篇:从零搭建 Spring Boot 3 + Dubbo 3 + ZooKeeper 微服务实战

技术栈速览组件版本说明Spring Boot3.2.6基础框架Apache Dubbo3.3.4RPC 框架ZooKeeper3.9.2注册中心&#xff08;Docker 部署&#xff09;Curator5.xZK 客户端&#xff08;由 Starter 管理&#xff09;JDK17Spring Boot 3 最低要求项目目录结构先把整体结构了然于胸&#xff0c…...

联合循环——14 厂用电缆介绍

一、电缆的应用类别 电缆&#xff0c;是连接两个设备传输电信号的组件&#xff0c;由两条或更多的导线粘合、扭曲或编织在一起形成。电缆的用途广泛并且每个用途都需特制&#xff0c;它的功能大至传输电能、电信号和实现电磁能转换的线材产品。 电力缆通常由传输电力或电信号的…...