原创

RabbitMQ实现延时队列


上次面试阿里,问了我项目难点,我说不出,寄了,然后我就再项目中加了支付功能,支付有一个15分钟未支付取消订单的功能,我用了rabbitMQ的延时队列去实现

总体的设计

一个交换器,两个队列(一个死信队列,一个普通对列),首先客户端请求一个订单,把订单交给交换机,交换机根据routing-key把消息交给死信队列 设置死信队列中的消息的过期时间,我这里设置为15分钟 15分钟过期后交给交换机,交换机根据routing-key把消息交给普通队列让他去做处理

代码创建交换机和队列

@Configuration
public class MyMQConfig {

    //死信队列
    @Bean
    public Queue orderDelayQueue(){
        //设置死信队列属性
        /**
         * x-dead-letter-exchange:order-event-exchange
         * x-dead-letter-routing-key:order.release.order
         * x-message-ttl:60000
         */
        Map<String,Object> arguments = new HashMap<>();
        arguments.put("x-dead-letter-exchange","order-event-exchange");
        arguments.put("x-dead-letter-routing-key","order-release-order");
        arguments.put("x-message-ttl",900000);

        Queue queue = new Queue("order.delay.queue", true, false, false,arguments);



        return  queue;
    }

    //普通的队列,用来处理死信队列中的出来的消息
    @Bean
    public Queue orderReleaseOrderQueue(){
        Queue queue = new Queue("order.release.order.queue",true,false,false);
        return queue;
    }

    //交换器
    @Bean
    public Exchange orderEventExchange(){
        TopicExchange topicExchange = new TopicExchange("order-event-exchange", true, false);

        return topicExchange;
    }

    @Bean
    public Binding OrderCreateOrderBinding(){
      return new Binding("order.delay.queue",
                Binding.DestinationType.QUEUE,
                "order-event-exchange",
                "order.create.order",null);
    }

    @Bean
    public Binding orderReleaseOrderBiding(){

        return new Binding("order.release.order.queue",
                Binding.DestinationType.QUEUE,
                "order-event-exchange",
                "order-release-order",null);
    }


}

监听普通队列

 @RabbitListener(queues = "order.release.order.queue")
    public void listener(Order order){
        Integer status = order.getStatus();
        if (status != 1){
            baseMapper.deleteById(order.getId());
        }
    }

如果订单还未支付,就从数据库中把订单删除掉

Java
  • 作者:刘柄岐
  • 发表时间: 2022-03-12 13:30
  • 版权声明:自由转载-非商用