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);
注意事项
- 两者的区别是设置队列的过期时间是对该队列的所有消息生效的。
- 为消息设置TTL有一个问题:RabbitMQ只对处于队头的消息判断是否过期(即不会扫描队列),所以,很可能队列中已存在死消息,但是队列并不知情。这会影响队列统计数据的正确性,妨碍队列及时释放资源。
网友评论