Spring @Transactional 注解下发送MQ消息的时机分析
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消息应该是在事务提交之后才会被消费。
原文地址: https://www.cveoy.top/t/topic/pgKi 著作权归作者所有。请勿转载和采集!