快捷搜索: 王者荣耀 脱发

解决方案:rabbitmq使用场景-超时未支付订单处理

解决方案:rabbitmq使用场景-超时未支付订单处理


关键词

    TTL,死信 TTL Queue—>Dead Letter Exchanges—>Dead Letter Queue

消息的TTL(Time To Live)

消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消息分别设置TTL。对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就死了,称之为死信。

死信交换器 Dead Letter Exchanges

一个消息在满足如下条件下,会进死信路由,记住这里是路由而不是队列,一个路由可以对应很多队列。 (1) 一个消息被Consumer拒收了,并且reject方法的参数里requeue是false。也就是说不会被再次放在队列里,被其他消费者使用。 (2) 上面的消息的TTL到了,消息过期了。 (3) 队列的长度限制满了。排在前面的消息会被丢弃或者扔到死信路由上。

一、添加订单队列 创建

配置属性:

    x-message-ttl = 消息的存活时间 (毫秒) x-dead-letter-exchange = 死信交换器名称

二、死信交换器和死信队列 创建

三、下单:将订单信息发送到订单队列(指定了TTL时间)

//1.获取购物车列表

 //2.设置订单信息并保存
 
 //3.将订单编号发送到ordercreate_queue中(15s之后未支付,向死信队列中发送,后续取消订单)(此队列绑定死信队列)
 rabbitTemplate.convertAndSend("", "ordercreate_queue", order.getId());

四、创建监听器 监听死信队列:使用rabbitmq的死信队列,实现超时订单取消

/**
 * 监听ordertimeout_queue(ordercreate_queue绑定了死信交换器【ordertimeout_queue队列】)
 *
 * 15s未支付的订单信息
 *
 */
@Component
@RabbitListener(queues = "ordertimeout_queue")
public class OrderPayTimeoutListener {
          
   

    /**
     * 1.不扫码,交易没有在支付宝服务器创建
     * 2.扫码不支付,交易已经创建,执行关闭
     *
     * @param orderId
     * @throws Exception
     */
    @RabbitHandler
    public void orderTimeoutHandler(String orderId) throws Exception {
          
   
        //1.去支付宝服务器查询该订单的支付状态,只有处于未支付状态(WAIT_BUYER_PAY)才关闭交易
       
        //2.在支付宝服务器关闭该交易
      
        //3.本地关闭订单&记录订单日志&回滚库存&回滚销量
        
    }

}
经验分享 程序员 微信小程序 职场和发展