RabbitMQ---消息过期时间(TTL)

目前有两种方法可以设置消息的 TTL 。

  1. 通过队列属性设置,队列中所有消息都有相同的过期时间。

  2. 对消息本身进行单独设置,每条消息的 TTL 可以不同。

    如果两种方法一起使用,则消息的 TTL 以两者之间较小的那个数值为准。消息在队列中的生存时一旦超过设置 TTL 值时,就会变成"死信" (Dead Message) ,消费者将无法再收到该消息(当然也不是绝对)。


下面我介绍两种方式常用的写法。

第一种方式声明队列过期时间的方式:

Map<String, Object> args = new HashMap<String , Object>(); 
args.put("x-message-ttl " , 6000); 
channel.queueDeclare(queueName, durable, exclusive, autoDelete, argss) ;

第二种方式声明队列过期时间的方式:

AMQP .BasicProperties properties = new AMQP . BasicProperties() ; 
Properties.setDeliveryMode(2); 
properties.setExpiration("6000"); 
channel.basicPublish(exchangeName, routingKey, mandatory, properties,
"ttlTestMessage".getBytes());

上述设置过期时间的单位都是毫秒

额外补充以下一点

对于第一种设置队列属性的方法,一旦消息过期,就会从队列中抹去,而在第二种方法中,即使消息过期,也不会马上从队列中抹去,因为每条消息是否过期是在即将投递到消费者之前判定的。


为什么这两种方法处理的方式不一样?

因为第一种方法里,队列中己过期的消息肯定在队列头部, RabbitMQ 只要定期从队头开始扫描是否有过期的消息即可。而第二种方法里,每条消息的过期时间不同,如果要删除所有过期消息势必要扫描整个队列,所以不如等到此消息即将被消费时再判定是否过期,如果过期再进行删除即可。


知是行之始,行是知之成

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值