消息中间件之RocketMQ源码分析(二十五)

Broker存储事务消息

在Broker中,事务消息的初始化是通过BrokerController.initialTransaction()方法执行的。3个核心的初始化变量
在这里插入图片描述

1.TransactionalMessageService.

事务消息主要用于处理服务,默认实现类是TransactionalMessageServiceImpl.如果想自定义事务消息
处理实现类,需要实现TransactionMessageService接口,然后通过ServiceProvider.loadClass()方法进行加载。
TransactionalMessageService接口的基本操作定义如下
在这里插入图片描述

  • prepareMessage():用于保存Half事务消息,用户可以对其进行Commit或Rollback
  • deletePrepareMessage():用于删除事务消息,一般用于Broker回查失败的Half消息。
  • commitMessage():用于提交事务消息,使消费者可以正常地消费事务消息
  • rollbackMessage():用于回滚事务消息,回滚后消费者将不能够消费该消息。通常用于生产者主动进行Rollback时,以及Broker回查的生产者本地事务失败时
  • open():用于打开事务服务
  • close():用于关闭事务服务

2.transactionMessageCheckListener.

事务消息回查监听器,默认实现类是DefaultTransactionalMessageCheckListener.如果想自定义回查监听处理,需要继承AbstractTransactionalMessageCheckListener接口,然后通过ServiceProvider.loadClass()方法被加载

在这里插入图片描述
在这里插入图片描述

3.transactionalMessageCheckService.

事务消息回查服务是一个线程服务,定时调用transactionalMessageService.check()方法,检查超时的Half消息
是否需要回查
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

额外两个单独处理

上面三个事务处理类完成初始化后,Broker就可以处理事务消息了。
Broker存储事务消息和普通消息都是通过SendMessageProcessor类进行处理的,只是在存储消息时有两处事务消息需要单独处理。

第一个单独处理,sendMessage()

这里获取消息中的扩展字段MessageConst.PROPERTY_TRANSACTION_PREPARED的值,
如果该值为True则返回当前消息是事务消息;再判断当前Broker的配置是否支持事务消息,如果不支持就返回生产者不支持事务消息的信息;如果支持,则调用TransactionalMessageService#prepareMessage()方法保存Half消息
在这里插入图片描述

第二个单独处理:存储前事务消息预处理,处理方法是TransactionalMessageBridge.praseHalfMessageInner()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
该方法的功能是将原消息的Topic、queueId、susFlg存储在消息的扩展字段中,并且修改Topic的值为RMQ_SYS_TRANS_HALF_TOPIC,修改queueId的值为0,然后,与其他消息一样,调用DefaultMessageStore.putMessage()方法保存到CommitLog中,CommitLog存储成功后,通过CommitLog.DefaultAppendMessageCallback.doAppend()方法单独对事务消息进行处理
在这里插入图片描述
Prepared消息其实就是Half消息,其实现逻辑是,设置当前Half消息的
queueOffset值为0,而不是其真实的位点值。这样该位点就不会建立ConsumeQueue索引,自然也不能被消费者消费

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/503983.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubantu 安装jdk8

在 Ubuntu 上安装 JDK 8(Java Development Kit 8),你可以使用 OpenJDK 版本,它是 Java 的官方开源实现。以下是安装 JDK 8 的步骤: 1. **更新软件包索引**: sudo apt update 2. **安装 JDK 8…

【InternLM 实战营笔记】OpenCompass大模型评测

随着人工智能技术的快速发展, 大规模预训练自然语言模型成为了研究热点和关注焦点。OpenAI于2018年提出了第一代GPT模型,开辟了自然语言模型生成式预训练的路线。沿着这条路线,随后又陆续发布了GPT-2和GPT-3模型。与此同时,谷歌也…

div在vue的组件之中如何设置这个字体的颜色和样式大小

在Vue组件中设置<div>的字体颜色和样式大小可以通过两种主要方式实现&#xff1a;通过内联样式&#xff08;inline styles&#xff09;或者通过CSS类&#xff08;CSS classes&#xff09;。 使用内联样式 在Vue模板中直接在元素上使用style属性来设置样式。这种方法适用…

爬虫入门到精通_实战篇7(Requests+正则表达式爬取猫眼电影)_ 抓取单页内容,正则表达式分析,保存至文件,开启循环及多线程

1 目标 猫眼榜单TOP100&#xff1a;https://www.maoyan.com/board 2 流程框架 抓取单页内容&#xff1a;利用requests请求目标站点&#xff0c;得到单个网页HTML代码&#xff0c;返回结果。正则表达式分析&#xff1a;根据HTML代码分析得到电影名称,主演,上映时间,评分,图片…

Maven编译报processing instruction can not have PITarget with reserveld xml name

在java项目中&#xff0c;平时我们会执行mvn clean package命令来编译我们的java项目&#xff0c;可是博主今天执行编译时突然报了 processing instruction can not have PITarget with reserveld xml name 这个错&#xff0c;网上也说法不一&#xff0c;但是绝大绝大部分是因…

Java求职技能清单(2024版)

一、Java基础扎实&#xff08;反射、集合、IO、NIO、多线程、设计模式、通信协议等基础技术&#xff09; &#xff08;一&#xff09;Java &#xff08;二&#xff09;网络IO &#xff08;三&#xff09;NIO模型 &#xff08;…

李沐动手学习深度学习——3.6练习

本节直接实现了基于数学定义softmax运算的softmax函数。这可能会导致什么问题&#xff1f;提示&#xff1a;尝试计算exp(50)的大小。 可能存在超过计算机最大64位的存储&#xff0c;导致精度溢出&#xff0c;影响最终计算结果。 本节中的函数cross_entropy是根据交叉熵损失函数…

CloudCompare使用-点云手动分割操作

点云手动分割操作 一、概述二、分割步骤1. 点击分割按钮2. 分割标题栏 一、概述 我们有时候需要对点云进行局部分割&#xff0c;就想对下面这个四棱锥和立方体的组合体给分离出来。 分离的效果如下&#xff1a; 二、分割步骤 1. 点击分割按钮 有两个入口 1. 菜单栏 2. 快…

爬虫入门到精通_基础篇5(PyQuery库_PyQuery说明,初始化,基本CSS选择器,查找元素,遍历,获取信息,DOM操作)

1 PyQuery说明&#xff1a; PyQuery是python中一个强大而又灵活的网页解析库&#xff0c;如果你觉得正则写起来太麻烦&#xff0c;又觉得BeautifulSoup语法太难记&#xff0c;如果你熟悉jQuery的语法那么&#xff0c;PyQuery就是你绝佳的选择。 安装 pip3 install pyquery2 …

代码随想录第二十五天 78.子集 90.子集II 491.非递减子序列

LeetCode 78 子集 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&…

[伴学笔记]01-操作系统概述 [南京大学2024操作系统]

文章目录 前言jyy:01-操作系统概述 [南京大学2024操作系统]为什么要学操作系统?学习操作系统能得到什么? 什么是操作系统?想要明白什么是操作系统:时间线:1940s1950s-1960s1960-1970s年代. 信息来源: 前言 督促自己,同时分享所得,阅读完本篇大约需要10分钟,希望为朋友的技术…

数据迁移DTS | 云上MySQL 数据库迁移至达梦数据库

引入 云上 MySQL 数据库 —> 向达梦国产化数据库迁移 下载&安装 达梦客户端工具 DM->可参考之前国产化专栏达梦文章 创建模式 在客户端分别依次执行以下命令脚本&#xff08;这里没有通过客户端管理工具去创建达梦数据库的模式&#xff0c;当然也可以通过图形化界…