RocketMQ 整合springboot 事务消息分析

 

事务消息流程

RocketMQ 整合springboot 事务消息分析_第1张图片

 

 

整合分析

  • 查看源码
  • getTransactionListener() 方法判断是否注册监听()

RocketMQ 整合springboot 事务消息分析_第2张图片

 

  • 查看set方法哪里执行

RocketMQ 整合springboot 事务消息分析_第3张图片

  • 查看到 是在RocketMQTransactionConfiguration 的 registerTransactionListener() 方法注册

 

RocketMQ 整合springboot 事务消息分析_第4张图片

  • 依次寻找
  • afterSingletonsInstantiated 在springbean初始化完成后调用

通过分析这段代码 得知 需要实例化RocketMQTransactionListener 并且 实现 RocketMQLocalTransactionListener

  •  

 

  • 可以配置接收线程池信息
  • 设置使用哪个rocketmqTemplate

 

RocketMQ 整合springboot 事务消息分析_第5张图片

 

 

MyRocketListener 实现 加入IOC容器后 自动注册到对应rabbitmqTemplate中

package com.example.rocket.rocket.Linstener;

import com.example.rocket.rocket.bean.OrderPaidEvent;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.Random;

@Component
@RocketMQTransactionListener
@Slf4j
public class MyRocketListener implements RocketMQLocalTransactionListener {

    private  int flag = 1 ;
    
    
    @Override
    //执行本地事务
    public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        //本地事务
        try {
            local();
            log.info("本地事务执行完成 : {} , msg : {} " , msg.getHeaders().getId() , new String((byte[])msg.getPayload()) );
        }catch (Exception e){
            return RocketMQLocalTransactionState.ROLLBACK;
        }

        return RocketMQLocalTransactionState.UNKNOWN;
    }

    @Override
    //brocker 回调检查
    public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
        if (flag != 1){
            log.info("commit : {} , msg : {} "  , msg.getHeaders().getId() ,new String((byte[])msg.getPayload()) );
            return RocketMQLocalTransactionState.COMMIT;
        }
        log.info("rollback : {} , msg : {} "  , msg.getHeaders().getId() , new String((byte[])msg.getPayload()) );
        return RocketMQLocalTransactionState.ROLLBACK;
    }

    @Transactional
    public void local(){
        flag = new Random().nextInt(5) ;
    }
}

 

你可能感兴趣的:(java)