rabbitmq做超时订单取消

287 阅读2分钟

整体思路: 1.利用rabbitmq的延迟交换机和延迟队列机制,再下单的时候,给rabbitmq发送一个延迟信息,一般是传递订单id。 2.延迟时间结束,通过订单id,去查询订单状态,如果没下单,就把订单转成未支付状态。

这个延迟的时间也就是,我们想要做超时时间的30分钟,十分钟等那个时间。

避坑: 1.rabbitmq做延时队列其实是不如java自带的延时队列的,因为对于rabbitmq来说,延时队列就是他功能中的很小一部分,稍微有点浪费资源。 2.rabbitmq做延时队列,配置config,交换机用DirectExchange,队列还是Queue,参数会有不一样的。

Queue配置:

@Bean
public Queue delayQueue() {
    Map<String, Object> params = new HashMap<>();
    // x-dead-letter-exchange 声明了队列里的死信转发到的DLX名称,
    params.put("x-dead-letter-exchange", "死信交换机名字");
    // x-dead-letter-routing-key 声明了这些死信在转发时携带的 routing-key 名称。
    params.put("x-dead-letter-routing-key", "死信routingKey");
    return new Queue("队列名字", true, false, false, params);
}

交换机配置:

@Bean
public DirectExchange delayExchange() {
    // 一共有三种构造方法,可以只传exchange的名字, 第二种,可以传exchange名字,是否支持持久化,是否可以自动删除,
    // 第三种在第二种参数上可以增加Map,Map中可以存放自定义exchange中的参数
    // new DirectExchange(DELAY_EXCHANGE,true,false);
    return new DirectExchange("交换机名字");
}

绑定交换机和队列:

@Bean
public Binding orderBinding() {
//delayQueue()和delayExchange()都是前面两个初始化队列和交换机的方法,也可以通过Bean注入的方式注入。routingKey我的理解就是一个密匙,在使用到队列时候,才知道你用的哪一个队列和交换机。
    return BindingBuilder.bind(delayQueue()).to(delayExchange()).with(ROUTING_KEY);
}