ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 1. ttl最大存活时间 TTL是什么呢?TTL是RabbitMQ中一个消息或者队列的属性,表明一条消息或者该队列中的所有消息的最大存活时间,单位是毫秒。换句话说,如果一条消息设置了TTL属性或者进入了设置TTL属性的队列,那么这条消息如果在TTL设置的时间内没有被消费, 则会成为“死信”(至于什么是死信,请翻看上一篇)。如果同时配置了队列的TTL和消息的TTL,那么较小的那个值将会被使用。 # 2. 如何设置 ## 2.1 声明队列的TTL 第一种是在创建队列的时候设置队列的“x-message-ttl”属性,如下:这样所有被投递到该队列的消息都最多不会存活超过6s。 ``` Map<String, Object> args = new HashMap<String, Object>(); args.put("x-message-ttl", 6000); channel.queueDeclare(queueName, durable, exclusive, autoDelete, args); ``` ## 2.2 指定消息的ttl 通过postProccessr对Message对象进行处理 ~~~ public void sendDelayMsg(String msg, Integer delayTime) { log.info("dely sender send a message: {}",msg); rabbitTemplate.convertAndSend(DELAYED_EXCHANGE_NAME, DELAYED_ROUTING_KEY, msg, a -> { a.getMessageProperties().setDelay(delayTime); a.getMessageProperties().setExpiration("660"); return a; }); } ~~~ ## 2.3 区别 **1.第一种方式如果设置了队列的TTL属性,那么一旦消息过期,就会被队列丢弃。 2.而第二种方式,消息即使过期,也不一定会被马上丢弃,因为消息是否过期是在即将投递到消费者之前判定的,如果当前队列有严重的消息积压情况,则已过期的消息也许还能存活较长时间。 3.如果不设置TTL,表示消息永远不会过期,如果将TTL设置为0,则表示除非此时可以直接投递该消息到消费者,否则该消息将会被丢弃。**