RocketMQ事务消费整理,使用反射和函数式编程进行本地事务的动态监听

目录

摘要:

1、RocketMQ事务消费应用流程

 2、事务消费实现

优化方向:1、反射实现本地事务方法的动态监听,2、函数式编程实现监听方法传递

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){
        //执行本地事务
   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值