消息拉取客户端处理服务端相应|学习笔记

简介: 快速学习消息拉取客户端处理服务端相应

开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段)消息拉取客户端处理服务端相应】学习笔记,与课程紧密联系,让用户快速学习知识。

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


消息拉取客户端处理服务端相应

 

消息拉取客户端处理消息过程

在消息服务端把消息组装好了之后响应给客户端,客户端要怎么去处理?

image.png客户端的处理的入口在 pullKernelImpl ,从客户端发起请求的位置请求 broker ,然后点击进入 pullKernelImpl:

PullResult pullResult = this.mQClientFactory.getMQClientAPIImp1().pullMessage(

brokerAddr,

requestHeader,

timeoutMillis,

communicationMode,

pullcallback );

return pullResult;}

通过 mQClientinstance 去发起一个请求。发起请求之后,点击pullMessage进入,

case ASYNC:

this.pullMessageAsync(addr,request,timeoutMillis

pullcallback);

reture null;

case SYNC:

return this.pullMessesync(addr,request, tineoutMillis);

从上面的代码发现,ASYNS 是异步的,SYNS 是同步的,同步的线程会带点阻塞,异步会直接返回 null 。

进入同步:

private PullResult pu11Messagesync(

final string addr,

final RemotingCommand request,

final long timeoutMillis

) throws RemotingException,InterruptedException,MQBrokerException {

RemotingCommand response = this.remotingClient.invokeSync(addr,request,timeoutMillis);

assert response != null;

return this.processPullResponse(response);

}

在这里会得到当前的响应。得到响应之后, processPullResponse 就开始去处理拉取请求的响应信息。

进入 processPullResponse :

发现,首先解析了响应头(respinseHeader)。然后封装了一个 PullResultExt 这样的一个结果类。

PullMessageResponseHeader responseHeader =

(PullMessageResponseHeader) respanse.decodeCommandCustomHeader(PullMessageResponseHeader.class); // 解析响应头

return new PullResultExt(pullstatus,responseHeader.getNextBeginoffset(),responseHeader.getMinoffset(),

responseHeader.getMaxoffset(),msgFoundList null,responseHeader.getSuggestWhichBrokerId(),response.getBody());} // 封装

然后返回,返回到哪里?

在发起请求的时候不管是同步还是异步,里面都会有一个 PullCallback 。

在PullCallback当中,会去做响应的具体的处理,进去PullCallback当中,进行以下操作:

image.png首先去 case 一下 PullResult .getPullstatus ,发现如果当前是找到(FOUND),

boolean dispatchToConsume = processQueue . putMessage(pullResult.getMsgFoundList());DefaultMQPushConsumerImpl.this.consuneMessageService.submitConsumeRequest(pullResult.getMsgFoundiList(),processQueue,pullRequest.getMessageQueue(),dispatchToconsume);

主要是将当前的这个消息拿出来之后放到 processQueue 当中。因为消息拉取和处理是解耦的,是分开去做的,所以把它提交到 processQueue 当中,然后再将 processQueue提交到 consumerMessageservice 当中去进行一个具体的处理。

以上内容是消息拉取客户端处理消息全过程。

总结:

image.png首先,客户端 (MQClientAPllpl) 的发起请求之后得到响应,然后它去解析响应码。解析响应码之后,它封装了一个 PullResultEXE 的结果对象,然后调用 PullCallback 回调函数。然后在回调函数主要做了两件事:第一件,取出消息并放到 processQueue 当中。然后再将 processQueue 提交到 PullMessageService当中的 consumeMessageService当中去进行具体的一个处理。这就是消息的客户端处理服务端的响应过程。

通过以上三个步骤,就把整个消息拉取的基本流程介绍完。其实在这个流程当中,只做了三件事,第一件,客户端一定要先发起请求;第二件,服务端处理请求,处理请求作为响应,客户端再去处理服务端它的相应学习。

相关文章
|
前端开发 JavaScript Java
Web.xml - Servlet与Filter的url-pattern
Web.xml - Servlet与Filter的url-pattern
293 8
|
安全 区块链
数字货币秒合约/交易所系统开发详细程序/案例项目/需求设计/方案逻辑/源码步骤
The development of a digital currency second contract/exchange system requires the following functions:
|
8月前
|
机器学习/深度学习 运维 数据可视化
《生成对抗网络:网络安全态势感知可视化的新引擎》
在数字化时代,网络安全至关重要。网络安全态势感知可视化通过直观展示网络状况,帮助快速发现威胁。生成对抗网络(GANs)作为前沿AI技术,正为这一领域带来变革。GANs由生成器和判别器组成,通过对抗训练生成逼真数据,用于数据增强、异常检测、威胁情报合成及动态场景模拟。尽管面临数据隐私、模型稳定性和可解释性等挑战,GANs的应用前景广阔,有望大幅提升网络安全水平。
317 22
完美解决Non-terminating decimal expansion; no exact representable decimal result.异常
完美解决Non-terminating decimal expansion; no exact representable decimal result.异常
27010 0
完美解决Non-terminating decimal expansion; no exact representable decimal result.异常
|
移动开发 前端开发 Java
第一次用java17记录运行ruoyi-vue-plus5.X版本
第一次用java17记录运行ruoyi-vue-plus5.X版本
334 0
|
存储 机器学习/深度学习 分布式计算
HDFS数据安全与隐私保护
HDFS数据安全与隐私保护
|
网络协议
Nmap 中的各种端口扫描技术
Nmap 中的各种端口扫描技术
643 0
|
存储 缓存 监控
利用Redis构建高性能的缓存系统
在现代Web应用中,性能优化是提升用户体验和响应速度的关键。Redis作为一款开源的内存数据结构存储系统,因其出色的性能、丰富的数据结构和灵活的使用方式,成为了构建高性能缓存系统的首选工具。本文将探讨Redis在缓存系统中的应用,分析其优势,并通过实例展示如何结合Redis构建高效、可靠的缓存系统,以应对高并发、大数据量等挑战。
|
数据可视化 Python
Python中绘制3D曲面图的艺术
【7月更文挑战第4天】使用Python的Matplotlib和mpl_toolkits.mplot3d库,可以轻松绘制3D曲面图。首先安装matplotlib,然后导入numpy和相关模块。通过定义函数和使用numpy的meshgrid生成数据,接着用`plot_surface`绘制曲面,可定制色彩映射、添加标签、标题、色标、透明度和阴影。通过自定义颜色映射和添加网格线,能进一步增强图形的解读性。这些技巧使3D数据可视化更具洞察力和吸引力。
|
Java 项目管理 Maven
【揭秘】Maven聚合与继承:如何轻松实现项目依赖管理?
Maven的聚合和继承是Java开发中重要的概念。聚合允许将多个项目组合成一个构建单元,简化多模块项目的构建过程,提高构建效率。继承则让子项目重用父项目的配置和属性,避免了重复定义,增强了项目的一致性和可维护性。通过聚合和继承,Maven为多模块项目的构建和管理提供了高效且灵活的支持,减少了配置冗余,提升了开发效率。
288 0
【揭秘】Maven聚合与继承:如何轻松实现项目依赖管理?