事务消息
事务消息机制。
事务消息的发送和处理总结为四个过程:
1.生产者发送事务消息和执行本地事务
2.Broker存储事务消息
3.Broker回查事务消息
4.Broker提交或回滚事务消息
生产者发送事务消息和执行本地事务。
发送过程分为两个阶段:
第一阶段,发送事务消息
第二阶段,发送endTransaction消息
事务消息发送过程的实现类TransactionMQProducer,该类继承鱼DefaultMQProducer,不仅能发送事务消息,还能发送其他消息。虽然4.2.0版本有事务消息代码,但实际是4.3.0版本才全面支持事务消息。
TransactionMQProducer的核心属性和方法:
- transactionListener:事务监听器,主要功能是执行本地事务和执行事务回查。事务监听器包含executeLocalTransaction()和checkLocalTransaction()两个方法。executeLocalTransaction()方法执行本地事务,checkLocalTransaction()方法是当生产者由于各种问题导致未发送Commit或Rollback消息给Broker时,Broker回调生产者查询本地事务专改的处理方法
- executorService:Broker回查请求处理的线程池
- start():事务消息生产者启动方法,与普通启动方法不同,增加了this.defaultMQProducerImpl.initTransactionEnv()的调用,即增加了初始化事务消息的环境信息
事务消息的环境初始化主要用于初始化Broker回查请求处理的线程池,
在初始化事务消息生产者时我们可以指定初始化对象,如果不指定初始化对象,那么这里会初始化一个单线程的线程池
- shutdown():关闭生产者,回收生产者资源。该方法时启动方法的逆过程,功能时关闭生产者、销毁事务环境。销毁事务环境是指销毁事务回查线程池,清楚回查任务队列
生产者发送事务消息主要分为如下两个阶段:
1.发送Half消息的过程
2.发送Commit或Rollback消息
发送Half消息的过程。
事务消息的发送是通过sendMessageInTransaction()方法来完成的
- 第一步,数据校验,判断TransactionListener的值是否为null、消息Topic为空检查、消息体为空检查等
- 第二步:消息预处理。预处理的主要功能是在消息扩展字段中设置消息类型。MessageConst.PROPERTY_TRANSACTION_PREPARED表示当前消息是事务Half消息。MessageConst.PROPERTY_PRODUCER_GROUP用于设置发送消息的生产者组名,以及设置事务消息的扩展字段
- 第三步:发送事务消息,调用同步发送消息的方法将事务消息发送出去
发送Commit或Rollback消息
在本地事务处理完成后,根据本地事务的执行结果调用DefaultMQProducerImpl.endTransaction()方法
通知Broker进行Commit或Rollback
当前Half消息发送完成后,会返回生产者消息发送到哪个Broker、消息位点是多少、再根据本地事务的执行
结果封装EndTransactionRequestHeader对象,最后调用MQClientAPIimpl.endTransactionOneway()方法
通知Broker进行Commit或Rollback
- brokerAddr:存储当前Half消息的Broker服务器的socket地址
- localTransactionState:本地事务执行结果
- transactionId:事务消息的事务id
- endTranactionOneway():以发送oneway消息的方式发送该RPC请求给Broker.