RabbitMQ的高级特性(三)-----TTL


TTL(Time To Live):存活时间/过期时间。

  • 当消息到达存活时间后,还没有被消费,会被自动清除。
  • RabbitMQ可以对消息设置过期时间,也可以对整个队列(Queue)设置过期时间。
  • 如果设置了消息的过期时间,也设置了队列的过期时间,它以时间短的为准。
  • 如果对交换机,队列做了修改。需要判断是否在mq中存在,存在先删再加,不存在直接加。否则会报错。io异常
  • 队列统一过期-控制后台演示:
    1. 增加队列,设置过期时间参数
    2. 增加交换机
    3. 绑定交换机和队列,设置路由key。
    4. 发送消息:Delivery mode:2-Persistent表示需要进行持久化
    5. 查看消息,可以看到消息,但十秒之后,消息自动消失,因为我们设置了十秒消息过期
  • 队列统一过期-代码演示:
    1. spring-rabbitmq-producer.xml配置
      <?xml version="1.0" encoding="UTF-8"?>
      
      	
      	
      
      	
      	
      	
      	
      
      	
      	
      
      	
      	
      	
      		
      			
      		
      	
      
      	
      	
      		
      		 
      			 
      			 
      		 
      	
      
      	
      	
      		
      		
      			
      		
      	
      
      
      
    2. 发送消息
      @Test
      public void testTTL() {
      	 for (int i = 0; i < 10; i++) {
      	   rabbitTemplate.convertAndSend("test_exchange_ttl","ttl.hehe","message ttl");
      	 }
      }
      
    3. 查看控制台,发现有10条消息,十秒之后自动过期
  • 消息过期-代码演示:
    /**
     * TTL:过期时间
     *  1. 队列统一过期
     *  2. 消息单独过期
     *  如果设置了消息的过期时间,也设置了队列的过期时间,它以时间短的为准。
     */
    @Test
    public void testMessageTtl() {
    	// 消息后处理对象,设置一些消息的参数信息
    	MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {
    
    		@Override
    		public Message postProcessMessage(Message message) throws AmqpException {
    			//1.设置message的信息
    			// 第二个方法:消息的过期时间 ,5秒之后过期
    			message.getMessageProperties().setExpiration("5000");
    			//2.返回该消息
    			return message;
    		}
    	};
    
    	//消息单独过期
    	rabbitTemplate.convertAndSend("test_exchange_ttl","ttl.hehe","message ttl....",messagePostProcessor);
    }
    

相关