前言
上篇文章介绍了RocketMQ事务消息的基本原理,对大致的流程及设计思路有个大致的了解
文章最后,也提出了几个问题
- 为什么prepare消息在发送后不会被消费?
- 事务消息又是如何提交、回滚的?
- 定时回查本地事务状态的机制又是怎么样?
废话不多说,直接盘源码,从源码中找问题答案,源码中都加了todo注释,方便大家查看
发送流程
先从事务消息发送方法入手TransactionMQProducer#sendMessageInTransaction
进到DefaultMQProducerImpl#sendMessageInTransaction方法
这是一个典型的两阶段提交过程 步骤1、2为第一阶段,步骤3为第二阶段
1、producer发送prepare消息给mq服务器
2、如果消息发送成功,执行本地事务,同时将消息transactionId与业务操作一并入库,方便后续事务回查
3、根据本地事务执行状态,决定是否对prepare消息进行提交/回滚,本地事务执行状态有下面几种
这时候再反过来看事务消息原理设计图,是不是清晰很多
方法中还剩两个关键方法
- this.send(msg)
- this.endTransaction(sendResult, localTransactionState, localException)
下面逐个分析,先看消息发送send()方法
事务消息发送
事务消息的发送,会执行到DefaultMQProducerImpl#sendDefaultImpl方法,再调用DefaultMQProducerImpl#sendKernelImpl方法发送消息,下面只贴出与事务消息相关代码