@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); }

        }
    });

}

rocketmq消息在其它服务消费,还是在库存保存成功前消费了内容:根据代码逻辑分析,发送MQ消息的代码被放在了事务提交后的回调函数中,即在事务提交后才会发送MQ消息。因此,MQ消息在库存保存成功前是不会被消费的。只有当事务提交成功后,MQ消息才会被发送到MQ消息队列,并由其他服务进行消费。

@Transactional(rollbackFor = Exception.class) - 提交订单后发送MQ消息保证数据一致性

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

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