RocketMQ 的事务消息实现主要是通过两阶段提交来保证消息的发送和事务状态的一致性。
-
发送阶段:生产者首先发送一条预备消息(Prepared Message)到Broker。预备消息是一种特殊的消息类型,它标记为不可直接消费,而是需要通过事务ID查询实际状态后才可以消费。
-
提交或回滚阶段:生产者在本地执行事务逻辑后,向Broker提交或回滚该事务。如果提交,预备消息变为可消费状态;如果回滚,预备消息将被删除。
以下是使用RocketMQ客户端实现事务消息的简化代码示例:
// 1. 创建事务消息生产者
TransactionMQProducer producer = new TransactionMQProducer("producerGroup");
producer.setNamesrvAddr("namesrvAddr");
producer.start();
// 2. 创建消息
Message msg = new Message("topic", "tag", "message body".getBytes(RemotingHelper.DEFAULT_CHARSET));
// 3. 发送预备消息
SendResult sendResult = producer.sendMessageInTransaction(msg, null);
// 4. 事务执行逻辑
// ...
// 5. 提交或回滚事务
try {
// 假设这是事务执行后的结果
boolean transactionStatus = true; // true=提交, false=回滚
producer.commitOrRollbackTransaction(sendResult, transactionStatus);
} catch (Exception e) {
// 处理异常
e.printStackTrace();
}
// 6. 关闭生产者
producer.shutdown();
在这个例子中,sendMessageInTransaction
方法负责发送预备消息。事务执行的结果决定了是否通过 commitOrRollbackTransaction
方法提交或回滚事务。如果提交,消息变为可消费;如果回滚,消息被删除。