消息发送1-消息校验|学习笔记

简介: 快速学习消息发送1-消息校验

开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段)消息发送1-消息校验】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/704/detail/12471


消息发送1-消息校验


消息发送

image.png

消息发送的过程主要分为四步:验证消息、查找路由、选择队列和发送消息

查找路由的目的是要知道当前的消息发给哪个broker,找到broker之后选择队列发送消息。

下面看消息发送的第一步:

1.消息校验

入口在DefaultMQProducer中的send方法,在发送时是通过defaultMQprodueerImpl实现类发送的。

public sendResult send(Nessage msg) throws MQClientException,RemotingException,NQBrokerException

validators.checkPessage(msg,defaultMQProducer: this);

msg.setTopic(withNamespace(mSg-getTopic());

return this.defaultNQprodueerImpl.send(msg);

}

进入defaultNQprodueerImpl:

public SendResult send(Nesskge msg) throws MQClientException,RemotingException,NQBrokerException

return send(msg,this.defaultMQProducer.getsendMsglimeo

ut());

getsendMsglimeout()这个参数是超时时间,默认是3s

以上内容中的send调用的是sendDefaultImpl方法,指定当前发送方式是同步,同步是内有回调函数,timeout是超时时间。

return this.sendDefaultImpl(msg,CommunicationMode.sYNc,sendCallback:i null timeout);

下面是消息发送的全部业务逻辑:

private sendResult sendbefaultimpk

Message msg,

final communicationtode communicationMode,

final Sendcal1back sendcal1back,

final long timeout

)throws wQclientException,RemotingException,MQBrokerException,InterruptedException {

this.makesurestateOK(;

validators.checkMessage(msg, this.dofaultNQProducer);

final long invokeID = random.nextLong(;

long beginTimestampFirst - system.currentTimeMillis();

long beginTimestampPrev - beginTimestampFirst;

long endTimestamp - beginTimestampFirst;

TopicpublishInfo topicPublishInfo = this.tryToFindTopicPublishInfo(msg.getTopic());

if (topicPublishInfo != nul1 && topicPublishInfo.ok()) {

boolean callTimeout = false;

MessageQueue mq = null;

Exception exception = null;

sendResult sendResult = null;

int timesTotal = communicationMode =m CommunicationMode.sYNc ? 1 + this.defaultMQProducor

int times = 0;

string[brokerssent = new String[timesTotal];

for (; times < timesTotal; timesi) {

在defaultMQprodueerImpl实现类中调用sendmessage,在sendmessage里设置超时时间,再调用senddefaultrImpl,最终的业务逻辑是在senddefaultrImpl完成。

validators.checkMessage是用来验证消息,主要验证:

public static void checkMessage(Message msg,DefaultMQProducer defaultMQProducer)

throws MQclientException {

//判断是否为空

if (null == msg) {

throw new MQc1ientException(Responsecode .MESSAGE_ILLE

GAL,“the message is null");

}

//校验主题(主题名称、长度是否合法,当前主题名称是否为默认主题名)

validators.checkTopic(msg.getTopic());

//校验消息体

if (null == msg.,getBodoy()) {

throw new MQclientException(ResponseCode.MESSAGE_I

LLEGAL,"the message body is nul1");

}

if (0 == msg-getBody ( .length) {

throw new MQClientException(ResponseCode.MESSAGE_I

LLEGAL,"the message body length is zero)

}

//取出消息长度,校验消息程度是否大于getMaxessag

eSize(),默认消息长度最大是4M

If (msg.getBody().longth > defaultMQProducer.getMaxessag

eSize()) {

throw new MQclientException(Responsecpde.MESSAGE_ILL

EGAL,

"the message body size over max value,NAx: " +default'QProducer.getMaxMessageSize())

}

总结:找到DefaultMQProducer中的send方法,之后进入defaultMQprodueerImpl,到return send(msg,this.defaultMQProducer.getsendMsglimeo

ut())设置超时时间,之后到validators.checkMessage(msg, this.dofaultNQProducer)进行消息校验,如主题校验、消息体校验。

相关文章
|
11月前
|
机器学习/深度学习 编解码 vr&ar
NeurIPS 2024最佳论文,扩散模型的创新替代:基于多尺度预测的视觉自回归架构
本文详细解读NeurIPS 2024最佳论文《视觉自回归建模:基于下一尺度预测的可扩展图像生成》。该研究提出VAR模型,通过多尺度token图和VAR Transformer结构,实现高效、高质量的图像生成,解决了传统自回归模型在二维结构信息、泛化能力和计算效率上的局限。实验表明,VAR在图像质量和速度上超越现有扩散模型,并展示出良好的扩展性和零样本泛化能力。未来研究将聚焦于文本引导生成和视频生成等方向。
1088 8
NeurIPS 2024最佳论文,扩散模型的创新替代:基于多尺度预测的视觉自回归架构
|
Rust 安全 编译器
初探 Rust 语言与环境搭建
Rust 是一门始于2006年的系统编程语言,由Mozilla研究员Graydon Hoare发起,旨在确保内存安全而不牺牲性能。通过所有权、借用和生命周期机制,Rust避免了空指针和数据竞争等问题,简化了并发编程。相较于C/C++,Rust在编译时预防内存错误,提供类似C++的语法和更高的安全性。Rust适用于系统编程、WebAssembly、嵌入式系统和工具开发等领域。其生态系统包括Cargo包管理器和活跃社区。学习资源如&quot;The Book&quot;和&quot;Rust by Example&quot;帮助新手入门。安装Rust可通过Rustup进行,支持跨平台操作。
418 2
初探 Rust 语言与环境搭建
|
存储 人工智能 物联网
端侧设备AI代理优化框架问世,领域内准确率可达97%
【7月更文挑战第30天】新框架Octo-planner提升端侧AI代理效率与准确性至97%。此框架由Nexa AI等机构合作研发,采用&quot;Planner-Action&quot;模式,将AI代理任务划分为规划与执行两部分,利用&quot;Octopus&quot;及&quot;Phi-3 Mini&quot;模型分别处理。通过fine-tuning技术及GPT-4辅助,实现在资源受限设备上的高性能。更多细节见论文: https://arxiv.org/pdf/2406.18082
358 1
|
安全 关系型数据库 分布式数据库
PolarDB-PG 安全体系全解,如何给客户7*24的放心
随着企业业务全面向数字化、在线化、智能化演进,企业面临着呈指数级递增的海量存储需求和挑战,传统的商业数据库已经难以满足和响应快速变化持续增长的业务诉求。云数据库凭借着成本、性能、业务连续性以及在线业务扩展等优势成为企业更优的选择。随着企业数据逐步上云,云数据库安全变得至关重要。云数据库安全不仅可以防止未授权访问和数据泄露问题,保护数据的机密性和完整性,还可以保护企业的声誉和客户信任,保障企业遵守法律法规的要求。只有通过确保云数据库的安全性,企业才能够在数字化时代中安心地利用云服务。
|
存储 网络协议 Ubuntu
Linux环境下SVN服务器的搭建与公网访问:使用cpolar端口映射的实现方法
由于文档资料越来越多,将所有资料都存放在自己的电脑上容易混淆,并且也不利于分享。这种情况下,考虑将资料上传SVN统一管理,这样一来其他人也能很方便的查略各种资料。
|
前端开发
CSS实现鼠标悬停图片向上浮动,放大,翻转
CSS实现鼠标悬停图片向上浮动,放大,翻转
557 0
|
前端开发 JavaScript
从0搭建Vue3组件库(五): 如何使用Vite打包组件库
从0搭建Vue3组件库(五): 如何使用Vite打包组件库
1082 0
|
Kubernetes 容灾 Serverless
阿里云容器服务 ACK 产品技术动态(202311)
容器服务 Kubernetes 版 ACK 【新功能】 Feature:支持创建托管节点池时开启指定自动化运维功能 在创建或编辑托管节点池时,您可以选择开启节点故障自愈、kubelet 自动升级、CVE 自动修复等功能,以降低您的节点池运维管理压力。
566 0
|
XML JSON 前端开发
SpringBoot2.x系列教程15--SpringBoot中整合HttpMessageConverters实现JSON格式化
前言 在之前的章节中,壹哥 带着各位学习了如何在Spring Boot中进行SSM整合。那么接下来,我们会继续深入研究SpringBoot对SpringMVC框架的支持,学习SpringBoot如何进行更深度的定制化Web开发。 前面我讲过,SpringBoot严格的来说,应该是一种负责把其他已有框架整合在一起的工具,SpringBoot主要是把各种框架都整合集中在一起,简化我们的Web开发。所以很多的功能,其实都不是SpringBoot完成的,而是由SpringBoot中整合的其他框架来完成的。比如Web开发,更多的是由SpringMVC来完成,只是SpringBoot很好的把Spring
1432 0
|
Linux 网络安全 开发工具
Python - poetry(1)包管理利器的入门介绍
Python - poetry(1)包管理利器的入门介绍
1354 0