ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
TTL 是 RabbitMQ 中一个消息或者队列的属性,表明<mark>一条消息或者该队列中的所有消息的最大存活时间,单位是毫秒</mark>。换句话说,如果一条消息设置了 TTL 属性或者进入了设置 TTL 属性的队列,那么这条消息如果在 TTL 设置的时间内没有被消费,则会成为死信。 <br/> 如果同时配置了队列的 TTL 和消息的TTL,那么较小的那个值将会被使用。 <br/> **1. 两种方式设置 TTL** (1)在创建队列的时候设置队列的`x-message-ttl`属性。 ```java @Bean("queueA") public Queue queueA() { Map<String, Object> args = new HashMap<>(16); //声明队列的 TTL args.put("x-message-ttl", 10000); return QueueBuilder.durable(QUEUE_A).withArguments(args).build(); } ``` (2)在生产者针对每条消息设置 TTL。 ```java rabbitTemplate.convertAndSend("X", "XC", message, processor -> { //设置消息的TTL为2000ms processor.getMessageProperties().setExpiration("2000"); return processor; }); ``` <br/> **2. 两种方式的区别** 设置了队列的 TTL 属性,那么一旦消息过期,就会被队列丢弃,除非配置了死信队列则被丢到死信队列中。 <br/> 设置了消息的 TTL 属性,消息即使过期,也不一定会被马上丢弃,因为<mark>消息是否过期是在即将投递到消费者之前判定的</mark>,如果当前队列有严重的消息积压情况,则已过期的消息也许还能存活较长时间。 <br/> 另外,还需要注意的一点是,如果不设置 TTL,表示消息永远不会过期,如果将 TTL 设置为 0,则表示除非此时可以直接投递该消息到消费者,否则该消息将会被丢弃。