美文网首页技术篇
RabbitMQ的TTL消息详解

RabbitMQ的TTL消息详解

作者: 若兮缘 | 来源:发表于2019-03-22 08:02 被阅读28次

TTL说明

  • TTL是Time To Live的缩写,也就是生存时间
  • RabbitMQ支持消息的过期时间,在消息发送时可以进行指定
  • RabbitMQ支持为每个队列设置消息的超时时间,从消息入队列开始计算,只要超过了队列的超时时间配置,那么消息会自动的清除

TTL演示

这次演示我们不写代码,只通过管控台进行操作,实际测试也会更为方便一些。

1.创建Exchange

选择Exchange菜单,找到下面的Add a new exchange

2.创建Queue

选择Queue菜单,找到下面的Add a new queue

3.建立队列和交换机的绑定关系

点击Exchange表格中的test002_exchange,在下面添加绑定规则

4.发送消息

点击Exchange表格中的test002_exchange,在下面找到Publish message,设置消息进行发送

5.验证

点击Queue菜单,查看表格中test002已经有了一条消息,10秒后表格显示0条,说明过期时间到了消息被自动清除了。

6.设置单条消息过期时间

点击Exchange表格中的test002_exchange,在下面找到Publish message,设置消息的过期时间并进行发送,此时观察test002队列,发现消息5s后就过期被清除了,即使队列设置的过期时间是10s。

TTL代码设置

消息的过期时间设置
        AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
                .expiration("10000") //10s过期
                .build();
        //发送消息
        channel.basicPublish(exchange, routingKey, true, properties, msg.getBytes());
队列的过期时间设置
        //设置队列的过期时间10s
        Map<String,Object> param = new HashMap<>();
        param.put("x-message-ttl", 10000);
        //声明队列
        channel.queueDeclare(queueName, true, false, false, null);
注意事项
  1. 两者的区别是设置队列的过期时间是对该队列的所有消息生效的。
  2. 为消息设置TTL有一个问题:RabbitMQ只对处于队头的消息判断是否过期(即不会扫描队列),所以,很可能队列中已存在死消息,但是队列并不知情。这会影响队列统计数据的正确性,妨碍队列及时释放资源。

相关文章

网友评论

    本文标题:RabbitMQ的TTL消息详解

    本文链接:https://www.haomeiwen.com/subject/mcsfvqtx.html