TTL說(shuō)明
- TTL是
Time To Live
的縮寫,也就是生存時(shí)間 - RabbitMQ支持消息的過(guò)期時(shí)間浪慌,在消息發(fā)送時(shí)可以進(jìn)行指定
- RabbitMQ支持為每個(gè)隊(duì)列設(shè)置消息的超時(shí)時(shí)間趁桃,從消息入隊(duì)列開始計(jì)算,只要超過(guò)了隊(duì)列的超時(shí)時(shí)間配置扔役,那么消息會(huì)自動(dòng)的清除
TTL演示
這次演示我們不寫代碼帆喇,只通過(guò)管控臺(tái)進(jìn)行操作,實(shí)際測(cè)試也會(huì)更為方便一些亿胸。
1.創(chuàng)建Exchange
選擇Exchange菜單坯钦,找到下面的Add a new exchange
2.創(chuàng)建Queue
選擇Queue菜單预皇,找到下面的Add a new queue
3.建立隊(duì)列和交換機(jī)的綁定關(guān)系
點(diǎn)擊Exchange表格中的test002_exchange
,在下面添加綁定規(guī)則
4.發(fā)送消息
點(diǎn)擊Exchange表格中的test002_exchange
婉刀,在下面找到Publish message
吟温,設(shè)置消息進(jìn)行發(fā)送
5.驗(yàn)證
點(diǎn)擊Queue菜單,查看表格中test002已經(jīng)有了一條消息突颊,10秒后表格顯示0條鲁豪,說(shuō)明過(guò)期時(shí)間到了消息被自動(dòng)清除了爬橡。
6.設(shè)置單條消息過(guò)期時(shí)間
點(diǎn)擊Exchange表格中的test002_exchange
友绝,在下面找到Publish message
迁客,設(shè)置消息的過(guò)期時(shí)間并進(jìn)行發(fā)送,此時(shí)觀察test002隊(duì)列粘室,發(fā)現(xiàn)消息5s后就過(guò)期被清除了卜范,即使隊(duì)列設(shè)置的過(guò)期時(shí)間是10s。
TTL代碼設(shè)置
消息的過(guò)期時(shí)間設(shè)置
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.expiration("10000") //10s過(guò)期
.build();
//發(fā)送消息
channel.basicPublish(exchange, routingKey, true, properties, msg.getBytes());
隊(duì)列的過(guò)期時(shí)間設(shè)置
//設(shè)置隊(duì)列的過(guò)期時(shí)間10s
Map<String,Object> param = new HashMap<>();
param.put("x-message-ttl", 10000);
//聲明隊(duì)列
channel.queueDeclare(queueName, true, false, false, null);
注意事項(xiàng)
- 兩者的區(qū)別是設(shè)置隊(duì)列的過(guò)期時(shí)間是對(duì)該隊(duì)列的所有消息生效的。
- 為消息設(shè)置TTL有一個(gè)問(wèn)題:RabbitMQ只對(duì)處于隊(duì)頭的消息判斷是否過(guò)期(即不會(huì)掃描隊(duì)列)奥裸,所以,很可能隊(duì)列中已存在死消息樟氢,但是隊(duì)列并不知情侠鳄。這會(huì)影響隊(duì)列統(tǒng)計(jì)數(shù)據(jù)的正確性伟恶,妨礙隊(duì)列及時(shí)釋放資源。