【RabbitMQ】09-取消超时订单

  • 生产者完成创建订单和扣减库存之后,发送消息到延迟队列。
java 复制代码
// 3.清理购物车商品
        cartClient.deleteCartItemByIds(itemIds);
        // cartService.removeByItemIds(itemIds);

        // 4.扣减库存
        try {
            itemClient.deductStock(detailDTOS);
            //itemService.deductStock(detailDTOS);
        } catch (Exception e) {
            throw new RuntimeException("库存不足!");
        }

        // 5.TODO发送延迟消息,检查用户是否已经支付完成
        rabbitTemplate.convertAndSend(MQConstants.DELAY_EXCHANGE_NAME,
                MQConstants.DELAY_ORDER_KEY,
                order.getId(),
                message -> {
                    message.getMessageProperties().setDelay(10000);
                    return message;
                });
  • 消费者监听消息,先查订单状态,没支付在查支付信息。
java 复制代码
@Slf4j
@Component
@AllArgsConstructor
public class OrderDelayMessageListener {

    private final IOrderService orderService;
    private final PayClient payClient;

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = MQConstants.DELAY_ORDER_QUEUE_NAME),
            exchange = @Exchange(name = MQConstants.DELAY_EXCHANGE_NAME, delayed = "true"),
            key = MQConstants.DELAY_ORDER_KEY
    ))
    public void listenOrderDelayMessage(Long orderId) {
        // 1.查询订单状态
        Order order = orderService.getById(orderId);

        // 2.检测订单状态,判断是否已支付
        if(order == null || order.getStatus()!=1) {
            log.info("delayMQ:用户已支付订单【{}】",orderId);
            return;
        }

        // 3.未支付,查询订单流水
        PayOrderDTO payOrder = payClient.queryPayOrderByBizOrderNo(orderId);

        // 4.判断是否支付
        if (payOrder == null || payOrder.getStatus() == 3) {
            // 4.1 已支付,标记订单状态已支付
            orderService.markOrderPaySuccess(orderId);
            log.info("delayMQ:已更新订单【{}】",orderId);
        } else {
            // 4.2 未支付,取消订单,恢复库存
            orderService.cancelOrder(orderId);
            log.info("delayMQ:已取消订单【{}】",orderId);
        }
    }
}
相关推荐
巧克力味的桃子3 小时前
Spark 课程核心知识点复习汇总
大数据·分布式·spark
Java 码农4 小时前
RabbitMQ集群部署方案及配置指南05
分布式·rabbitmq
小马爱打代码4 小时前
ZooKeeper:五种经典应用场景
分布式·zookeeper·云原生
上海锟联科技7 小时前
DAS一体化光模块
分布式·分布式光纤传感·ofdr·光频域反射·das
Java 码农8 小时前
RabbitMQ集群部署方案及配置指南01
linux·服务器·rabbitmq
Overt0p8 小时前
抽奖系统(6)
java·spring boot·redis·设计模式·rabbitmq·状态模式
Java 码农8 小时前
RabbitMQ集群部署方案及配置指南04
分布式·rabbitmq
独自破碎E9 小时前
在RabbitMQ中,怎么确保消息不会丢失?
分布式·rabbitmq
Java 码农9 小时前
RabbitMQ集群部署方案及配置指南02
分布式·rabbitmq
虫小宝9 小时前
京东返利app分布式追踪系统:基于SkyWalking的全链路问题定位
分布式·skywalking