千家信息网

RocketMQTransactionAnnotationProcessor的原理和用法

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"RocketMQTransactionAnnotationProcessor的原理和用法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如
千家信息网最后更新 2026年11月01日RocketMQTransactionAnnotationProcessor的原理和用法

本篇内容介绍了"RocketMQTransactionAnnotationProcessor的原理和用法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

序

本文主要研究一下RocketMQTransactionAnnotationProcessor

RocketMQTransactionAnnotationProcessor

rocketmq-spring-boot-2.0.3-sources.jar!/org/apache/rocketmq/spring/config/RocketMQTransactionAnnotationProcessor.java

public class RocketMQTransactionAnnotationProcessor    implements BeanPostProcessor, Ordered, ApplicationContextAware {    private final static Logger log = LoggerFactory.getLogger(RocketMQTransactionAnnotationProcessor.class);    private ApplicationContext applicationContext;    private final Set> nonProcessedClasses =        Collections.newSetFromMap(new ConcurrentHashMap, Boolean>(64));    private TransactionHandlerRegistry transactionHandlerRegistry;    public RocketMQTransactionAnnotationProcessor(TransactionHandlerRegistry transactionHandlerRegistry) {        this.transactionHandlerRegistry = transactionHandlerRegistry;    }    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        this.applicationContext = applicationContext;    }    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        return bean;    }    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        if (!this.nonProcessedClasses.contains(bean.getClass())) {            Class targetClass = AopUtils.getTargetClass(bean);            RocketMQTransactionListener listener = AnnotationUtils.findAnnotation(targetClass, RocketMQTransactionListener.class);            this.nonProcessedClasses.add(bean.getClass());            if (listener == null) { // for quick search                log.trace("No @RocketMQTransactionListener annotations found on bean type: {}", bean.getClass());            } else {                try {                    processTransactionListenerAnnotation(listener, bean);                } catch (MQClientException e) {                    log.error("Failed to process annotation " + listener, e);                    throw new BeanCreationException("Failed to process annotation " + listener, e);                }            }        }        return bean;    }    private void processTransactionListenerAnnotation(RocketMQTransactionListener listener, Object bean)        throws MQClientException {        if (transactionHandlerRegistry == null) {            throw new MQClientException("Bad usage of @RocketMQTransactionListener, " +                "the class must work with RocketMQTemplate", null);        }        if (!RocketMQLocalTransactionListener.class.isAssignableFrom(bean.getClass())) {            throw new MQClientException("Bad usage of @RocketMQTransactionListener, " +                "the class must implement interface RocketMQLocalTransactionListener",                null);        }        TransactionHandler transactionHandler = new TransactionHandler();        transactionHandler.setBeanFactory(this.applicationContext.getAutowireCapableBeanFactory());        transactionHandler.setName(listener.txProducerGroup());        transactionHandler.setBeanName(bean.getClass().getName());        transactionHandler.setListener((RocketMQLocalTransactionListener) bean);        transactionHandler.setCheckExecutor(listener.corePoolSize(), listener.maximumPoolSize(),                listener.keepAliveTime(), listener.blockingQueueSize());        RPCHook rpcHook = RocketMQUtil.getRPCHookByAkSk(applicationContext.getEnvironment(),            listener.accessKey(), listener.secretKey());        if (Objects.nonNull(rpcHook)) {            transactionHandler.setRpcHook(rpcHook);        } else {            log.debug("Access-key or secret-key not configure in " + listener + ".");        }        transactionHandlerRegistry.registerTransactionHandler(transactionHandler);    }    @Override    public int getOrder() {        return LOWEST_PRECEDENCE;    }}
  • RocketMQTransactionAnnotationProcessor实现了BeanPostProcessor, Ordered, ApplicationContextAware接口

  • postProcessAfterInitialization方法会查找标记有RocketMQTransactionListener注解的bean,然后执行processTransactionListenerAnnotation方法

  • processTransactionListenerAnnotation方法会创建transactionHandler,然后执行transactionHandlerRegistry.registerTransactionHandler进行注册

TransactionHandler

rocketmq-spring-boot-2.0.3-sources.jar!/org/apache/rocketmq/spring/config/TransactionHandler.java

class TransactionHandler {    private String name;    private String beanName;    private RocketMQLocalTransactionListener bean;    private BeanFactory beanFactory;    private ThreadPoolExecutor checkExecutor;    private RPCHook rpcHook;    public String getBeanName() {        return beanName;    }    public void setBeanName(String beanName) {        this.beanName = beanName;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public RPCHook getRpcHook() {        return rpcHook;    }    public void setRpcHook(RPCHook rpcHook) {        this.rpcHook = rpcHook;    }    public BeanFactory getBeanFactory() {        return beanFactory;    }    public void setBeanFactory(BeanFactory beanFactory) {        this.beanFactory = beanFactory;    }    public void setListener(RocketMQLocalTransactionListener listener) {        this.bean = listener;    }    public RocketMQLocalTransactionListener getListener() {        return this.bean;    }    public void setCheckExecutor(int corePoolSize, int maxPoolSize, long keepAliveTime, int blockingQueueSize) {        this.checkExecutor = new ThreadPoolExecutor(corePoolSize, maxPoolSize,            keepAliveTime, TimeUnit.MILLISECONDS,            new LinkedBlockingDeque<>(blockingQueueSize));    }    public ThreadPoolExecutor getCheckExecutor() {        return checkExecutor;    }}
  • TransactionHandler包含了name、beanName、bean、beanFactory、checkExecutor、rpcHook属性

TransactionHandlerRegistry

rocketmq-spring-boot-2.0.3-sources.jar!/org/apache/rocketmq/spring/config/TransactionHandlerRegistry.java

public class TransactionHandlerRegistry implements DisposableBean {    private RocketMQTemplate rocketMQTemplate;    private final Set listenerContainers = new ConcurrentSet<>();    public TransactionHandlerRegistry(RocketMQTemplate template) {        this.rocketMQTemplate = template;    }    @Override    public void destroy() throws Exception {        listenerContainers.clear();    }    public void registerTransactionHandler(TransactionHandler handler) throws MQClientException {        if (listenerContainers.contains(handler.getName())) {            throw new MQClientException(-1,                String                    .format("The transaction name [%s] has been defined in TransactionListener [%s]", handler.getName(),                        handler.getBeanName()));        }        listenerContainers.add(handler.getName());        rocketMQTemplate.createAndStartTransactionMQProducer(handler.getName(), handler.getListener(), handler.getCheckExecutor(), handler.getRpcHook());    }}
  • TransactionHandlerRegistry实现了DisposableBean接口,其clear方法直接清空listenerContainers;registerTransactionHandler方法会往listenerContainers添加该handler的name,然后执行rocketMQTemplate.createAndStartTransactionMQProducer来创建并启动TransactionMQProducer

小结

  • RocketMQTransactionAnnotationProcessor实现了BeanPostProcessor, Ordered, ApplicationContextAware接口

  • postProcessAfterInitialization方法会查找标记有RocketMQTransactionListener注解的bean,然后执行processTransactionListenerAnnotation方法

  • processTransactionListenerAnnotation方法会创建transactionHandler,然后执行transactionHandlerRegistry.registerTransactionHandler进行注册

"RocketMQTransactionAnnotationProcessor的原理和用法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

方法 接口 原理 内容 更多 标记 注解 知识 实用 学有所成 接下来 困境 实际 小结 属性 情况 文章 案例 编带 网站 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 花魁咖啡 广州紫鲸互联网科技有限公司 互联网科技行业发展 科技创新与互联网经济 互联网络科技有限公司 互联网金融 科技金融 北京互联网络科技有限公司 米客互联网科技 科技类的互联网平台 上海电发互联网科技有限公司 卫星互联网科技股票 天速互联网络科技有限公司 互联网和黑科技的看法 互联网科技革命什么开始 亳州好赞互联网科技有限公司 畅思互联网科技 迪庆互联网科技招生 艺电能源互联网科技有限公司招聘 互联网科技手抄报图片 中国主要互联网科技公司 平安科技 互联网 居家互联网科技有限公司 甘肃拓世互联网科技有限公司 速维有品互联网信息科技(苏州)有限公司 互联网科技人工智能实验室 允成互联网科技有限公司融资 滨湖区互联网智能科技产品有哪些 伍佰万互联网科技怎么赚钱 广东工业互联网大赛深圳学泰科技 互联网营销推广黑科技
0