RabitMq过期时间TTL

第一种:给消息设置过期时间  启动一个插件

 @Bean
    public DirectExchange DirectExchange() {
        return new DirectExchange("ttl_direct_exchange", true, false);
    }

     //给消息设置过期时间
    @Bean
    public Queue ttlMessageQueue() {
        return new Queue("ttl.message.direct.queue", true);
    }

    @Bean
    public Binding ttlMessageBind() {
        return BindingBuilder.bind(ttlMessageQueue()).to(DirectExchange()).with("ttlMessage");
    }




public void ttlMessage() {
    String orderId= UUID.randomUUID().toString();
    String exchangeName3="ttl_direct_exchange";
    MessagePostProcessor messagePostProcessor=new MessagePostProcessor() {
        //设置消息的过期时间
        @Override
        public Message postProcessMessage(Message message) throws AmqpException {
            message.getMessageProperties().setExpiration("5000");
            message.getMessageProperties().setContentEncoding("UTF-8");
            return message;
        }
    };
    String ttl="ttlMessage";
    rabbitTemplate.convertAndSend(exchangeName3,ttl,orderId);
}

 第二种给队列设置过期时间:

   @Bean
    public Queue ttlQueue() {
        Map<String,Object> args=new HashMap<>();
        args.put("x-message-ttl",5000);//这里过期时间一定是一个INT类型
        return new Queue("ttl.direct.queue", true,false,false,args);
    }
      //绑定过期队列与路由
    @Bean
    public Binding ttlBind() {
        return BindingBuilder.bind(ttlQueue()).to(DirectExchange()).with("ttl");
    }


 public void makeOrder() {
        String orderId= UUID.randomUUID().toString();
        System.out.println("订单ok");
        //带有过期时间的ttl
        String exchangeName3="ttl_direct_exchange";
        String ttl="ttl";
        rabbitTemplate.convertAndSend(exchangeName3,ttl,orderId);
    }

   如果:设置了两种过期时间,以时间短的为基准,因为无论是队列先过期,还是队列里面的消息先过期,另一个单独存在都没有意义

 

队列过期和消息过期的最大区别是,队列过期了里面的信息可以当作别处用,去处理,比如死信队列,

而消息过期就是单纯的过期,就是这条消息没有了

 

 启用消息过期的插件  ./rabbitmq-plugins enable  rabbitmq-delayed-message-exchange

 

https://github.com/rabbitmq/rabbitmq-delayed-message-exchange

这个只是针对消息过期3.8.x不支持,队列过期还是一样的用

用法;开启插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange

 

声明一个死信队列:其实也是个普通队列,只不过下面去绑定过来而已

 

    @Bean("order_real_dead_exchange")
    public DirectExchange deadExchange() {
        return new DirectExchange("order_real_dead_exchange", true, false);
    }

    @Bean("order_real_dead_queue")
    public Queue dead() {
        return new Queue("order_real_dead_queue", true);
    }


    @Bean
    public Binding deadBinding(@Qualifier("order_real_dead_queue") Queue queue
            ,@Qualifier("order_real_dead_exchange")DirectExchange directExchange) {
        return BindingBuilder.bind(queue).to(directExchange).with("real_dead");
    }

 

声明绑定队列:

 

    @Bean("order_producer_ttl_exchange")
    public DirectExchange producerExchange() {
        return new DirectExchange("order_producer_ttl_exchange", true, false);
    }
//设置延迟队列
    @Bean("order_producer_ttl_queue")
    public Queue producerQueue() {
        Map<String,Object> args=new HashMap<>();
//        args.put("x-message-ttl",5000);//这里过期时间一定是一个INT类型   这里是声明队列过期
        args.put("x-dead-letter-exchange","order_real_dead_exchange");//绑定死信队列交换机
//        args.put("x-max-length",500);//指定最大接受多少条
        args.put("x-dead-letter-routing-key","real_dead");//fanout没有key
        return new Queue("order_producer_ttl_queue",true,false,false,args);
    }


    @Bean
    public Binding producerBinding(@Qualifier("order_producer_ttl_queue") Queue queue,
                                  @Qualifier("order_producer_ttl_exchange")DirectExchange directExchange) {
        return BindingBuilder.bind(queue).to(directExchange).with("order_ttl_producer");
    }

 

指定消息过期:
       rabbitTemplate.convertAndSend("order_producer_ttl_exchange","order_ttl_producer", bytes,  new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setExpiration("10000");//这条消息过期
                message.getMessageProperties().setContentEncoding("UTF-8");
                return message;
            }
        });

 

tips:延迟发送目前需要升级rabbitMq3.9才行
    rabbitTemplate.convertAndSend("order_producer_delay_exchange","order_delay_producer", s, new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                 message.getMessageProperties().setHeader("x-delay",10000);
                 message.getMessageProperties().setContentEncoding("UTF-8");
                return message;
            }
        });

 

posted @ 2021-03-26 21:55  余生请多指教ANT  阅读(64)  评论(0编辑  收藏  举报