设置消息的 TTL
- 第一种方法是通过队列属性设置
- 第二种方法是对消息本身进行单独设置
- 如果两种方法一起使用,则消息的 TTL 以两者之间较小的那个数值为准
- 消息在队列中的生存时间超过消息设置的TTL时,就会变成”死信" (Dead Message) ,消费者将无法再收到该消息(非绝对)
通过队列属性设置消息TTL 的方法是在 channel.queueDeclare 方法中加入x-message-ttl参数实现的.进入队列的消息都为这个过期时间。
不设置 TTL.表示消息不会过期 ;如果将 TTL 设置为0 ,表示除非此时直接将消息投递到消费者,否则该消息会被立即丢弃.
Map<String, Object> ttl = new HashMap<String , Object>();
ttl.put("x-message-ttl" , 6000);
channel . queueDeclare(QUEUE_NAME ,true,false, false , ttl) ;
消息
下图的TTL标明这条队列是一个有时间限制的对列,进入的消息有统一的存活时间
针对每条消息设置TTLchannel.basicPublish 方法中加入expiration的属性参数,单位为毫秒。
AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
// 设置TTL=6000ms
builder.expiration("6000");
AMQP.BasicProperties properties = builder.build();
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, false, properties, message.getBytes());
消息过期,则会消失
设置队列的 TTL
RabbitMQ 会确保在时间过期后将队列删除,不保障删除有多及时。在RabbitMQ 重启后, 持久化的队列的过期时间会被重新计算。当然队列被删除了,队列内的数据也就不存在了。
Map<String, Object> ttlQueue = new HashMap<String, Object>(2);
ttlQueue.put( "x-expires" , 1800000);
// 声明(创建)队列
channel.queueDeclare(QUEUE_NAME, false, false, false, ttlQueue);
总结一下
注意盒设置消息的过期时间的区别。设置消息过期时间有两种方式,单独设置消息的过期时间(builder.expiration(“6000”);),和设置队列的属性让该队列内的消息拥有统一过期时间(x-message-ttl)。而设置队列的过期时间(x-expires)则是跟队列的删除相关。