这段代码中,发送 MQ 消息的部分是在事务提交之后执行的。在发送 MQ 消息之前,会先更新库存,然后再发送 MQ 消息。所以,在消费 MQ 消息时,查询库存的结果会是变更后的库存数量。

如果你想要在发送 MQ 消息之前查询扣减前的库存数量,可以将发送 MQ 消息的代码放在更新库存之前。这样,在发送 MQ 消息之前,你可以先查询库存,然后再进行库存的更新操作。

另外,在发送 MQ 消息的过程中,使用了事务来保证消息的可靠性。如果在发送 MQ 消息时出现异常,事务会回滚,库存的更新也会回滚。这样可以保证库存和 MQ 消息的一致性。

代码示例:

@Transactional(rollbackFor = Exception.class)
    TackAnOrderVo tackAnOrder(@RequestBody @Validated PlaceOrderVo vo){
   
//保存订单

//发送MQ消息更新es库存标志
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
            @Override
            public void beforeCommit() {
                //查询扣减前的库存
                //发送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 消息消费时查询库存问题及优化方案

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

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