目录
优化方向:1、反射实现本地事务方法的动态监听,2、函数式编程实现监听方法传递
摘要:
整理RocketMQ事务消费应用流程,并使用反射和函数式编程技术进行优化,实现对本地事务方法的动态监听
1、RocketMQ事务消费应用流程
需求场景:
一个下定请求,由商品服务A完成商品锁定,定单服务B完成定单创建
一致性问题:
1、在锁定商品提交事务前发送消息,则商品锁定失败的情况下会创建定单
2、如果锁定商品成功提交事务后再发送消息,若发送消息异常则不会创建定单
3、引入事务消费
RocketMQ事务消费解决流程图
半消息:RocketMQ 发送的事务消费消息,消息发送到broker但不允许消费者消费,需要等待发送方提交commit状态后,半消息才能正常被消费

2、事务消费实现
商品服务A:下定业务触发方法
public void goodSubmit(){
//发送下定半消息,数据仅测试使用
long transactionId=System.currentTimeMillis();
long orderId=123L;
producerSvc.sendMessageInTransaction(
"order-topic",
MessageBuilder.withPayload(orderId).setHeader("TRANSACTION_ID",transactionId).build(),
null
);
//发送完半消息后在本地事务监听器里面执行商品锁定方法goodLock()
}
商品服务A:需要进行事务监听的商品锁定方法
@Service
public class TransactionSvc {
@Autowired
RocketMQTemplate producerSvc;
@Autowired
TransactionLogDao logDao;
@Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
public boolean goodLock(long transactionId){
//执行发送半消息后需要的业务逻辑
System.out.println("模拟锁定商品,记录事务id");
TransactionLog log=new TransactionLog();
log.setId(transactionId);
logDao.insert(log);
//在同一事务里面,当商品锁定时,必然会记录事务id在日志表
return true;
}
}
RocketMQ监听事务实现
@RocketMQTransactionListener
public class MyLocalTransactionListener implements RocketMQLocalTransactionListener {
@Autowired
TransactionLogDao logDao;
@Autowired
TransactionSvc transactionSvc;
@Override
public RocketMQLocalTransactionState executeLocalTransaction(Message var1, Object var2){
//执行本地事务

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



