文章目录
TTL是什么?TTL的测试小结
TTL是什么?
TTL全称Time To Live(存活时间/过期时间) 。
当消息到达存活时间后,还没有被消费,会被自动清除。
RabbitMQ可以对消息设置过期时间,也可以对整个队列(Queue)设置过期时间。
TTl:消息的存活时间有两种
1.队列统一过期
2.消息单独过期
若设置了队列过期时间,也设置了消息过期时间,以时间短的为准。 若队列过期后,会将队列中所有消息移除。
只有消息在队列顶端时(即将被消费时),才会判断它是否过期(被移除掉),以提高轮询效率。
例如:10条消息在队列中,在队列中间有条5s后就会过期的消息M,而队列过期时间为100s,即使过了5s后,在还未消费到消息M前,M都不会被移除掉,不过该过期的还是过期,轮到消费M时 判断其是否过期,过期了就移除掉
TTL的测试
工程结构跟之前的一样:
spring-rabbitmq-producer.xml中相关配置:
port="${rabbitmq.port}" username="${rabbitmq.username}" password="${rabbitmq.password}" virtual-host="${rabbitmq.virtual-host}" publisher-confirms="true" publisher-returns="true" /> ProducerTest中的测试类: /** * ttl:消息的存活时间 * 1.队列统一过期 * 2.消息单独过期 * 若设置了队列过期时间,也设置了消息过期时间,以时间短的为准 * 若队列过期后,会将队列中所有消息移除 * 只有消息在队列顶端时(即将被消费时),才会判断它是否过期(被移除掉),以提高轮询效率 * 如10条消息在队列中,在队列中间有条5s后就会过期的消息M,而队列过期时间为100s,即使 * 过了5s后,在还未消费到消息M前,M都不会被移除掉,不过该过期的还是过期,轮到消费M时 * 判断其是否过期,过期了就移除掉 */ @Test public void testTtl() throws InterruptedException { //队列统一过期 // for (int i = 0; i < 10; i++) { // rabbitTemplate.convertAndSend("test_exchange_ttl","ttl.oh","test ttl..." + i); // } //消息单独过期 //消息后处理对象MessagePostProcessor MessagePostProcessor messagePostProcessor = new MessagePostProcessor() { public Message postProcessMessage(Message message) throws AmqpException { message.getMessageProperties().setExpiration("5000");//设置过期时间 return message; } }; //传入消息后处理对象设置参数 rabbitTemplate.convertAndSend("test_exchange_ttl","ttl.oh","test ttl...",messagePostProcessor); } 小结 设置队列过期时间使用参数: x-message-ttl,单位: ms(毫秒),会对整个队列消息统一过期。设置消息过期时间使用参数: expiration。单位: ms(毫秒),当该消息在队列头部时(消费时),会单独判断这—消息是否过期。如果两者都进行了设置,以时间短的为准。