Spring @Transactional 注解下发送MQ消息的时机分析

@Transactional(rollbackFor = Exception.class)
TackAnOrderVo tackAnOrder(@RequestBody @Validated PlaceOrderVo vo){

//提交订单

//提交库存

//提交其它

   // 发送消息到 MQ
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
            @Override
            public void afterCommit() {
                //发送mq更新es库存标志
                for (Long drugId : drugIdList) {
                    DrugChangeMessage drugChangeMessage = new DrugChangeMessage();
                    drugChangeMessage.setDrugId(drugId);
                    drugChangeMessage.setStoreId(order.getStoreId());
                    drugChangeMessage.setChangeType(5);
                    drugChangeMessage.setMerchantId(Long.parseLong(merchantId));
                    drugChangeMessage.setEnterpriseId(Long.parseLong(enterpriseId));
                    drugChangeMessage.setPlatformId(Long.parseLong(platformId));
                    drugProducer.sendDrugChangeMsg(drugChangeMessage);
                }

            }
        });

}

根据给出的代码,可以看到在@Transactional注解的作用下,tackAnOrder方法中的代码会在事务提交之后执行。但是,在代码中发送MQ消息的操作是在TransactionSynchronizationManager.registerSynchronization中注册的TransactionSynchronizationAdapter的afterCommit方法中执行的。

根据Spring事务机制,当事务提交之后,会先执行事务提交的操作,然后再执行提交成功后的操作,如发送MQ消息。所以,在这段代码中,MQ消息应该是在事务提交之后才会被消费。

Spring @Transactional 注解下发送MQ消息的时机分析

原文地址: https://www.cveoy.top/t/topic/pgKi 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录