RabbitMQ 过期时间TTL

设置消息的 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)则是跟队列的删除相关。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值