一 TTL(過期時間)
TTL是 Time-To-Live 的縮寫,RabbitMQ可以對消息和隊列設(shè)置TTL(過期時間)。
RabbitMQ針對隊列中的消息過期時間(Time To Live, TTL)有兩種方法可以設(shè)置。
第一種方法是通過隊列屬性設(shè)置,隊列中所有消息都有相同的過期時間。
第二種方法是對消息進行單獨設(shè)置,每條消息TTL可以不同。如果上述兩種方法同時使用,則消息的過期時間以兩者之間TTL較小的那個數(shù)值為準。消息在隊列的生存時間一旦超過設(shè)置的TTL值,就成為dead message,消費者將無法再收到該消息。
二 單條消息設(shè)置TTL(超時時間)
針對單條消息設(shè)置TTL的方法是MessagePostProcessor對象里setExpiration(過期時間)
- 當隊列消息的TTL 和消息TTL都被設(shè)置,時間短的TTL設(shè)置生效。
- 為消息設(shè)置TTL有一個問題:RabbitMQ只對處于隊頭的消息判斷是否過期(即不會掃描隊列),所以,很可能隊列中已存在死消息,但是隊列并不知情。這會影響隊列統(tǒng)計數(shù)據(jù)的正確性,妨礙隊列及時釋放資源。
rabbitTemplate.convertAndSend("timeOut.exchange.test","key.time.out",messageProperties,
// 設(shè)置消息過期時間: 單位:毫秒
message1 -> {
message1.getMessageProperties().setExpiration("10000");// 過期時間
message1.getMessageProperties().setDeliveryMode(MessageDeliveryMode.fromInt(2)); // 持久化
// 返回消息對象
return message1;
},correlationData);
對消息設(shè)置過期時間
// 為消息設(shè)置過期時間
message1.getMessageProperties().setExpiration("10000");// 過期時間
每條消息的過期時間不同,如果要刪除所有過期消息,勢必要掃描整個隊列,所以不如等到此消息即將被消費時再判定是否過期,如果過期,再進行刪除。
三 隊列設(shè)置TTL(超時時間)
通過隊列屬性設(shè)置消息TTL,在聲明隊列方法中加入x-message-ttl參數(shù)實現(xiàn)的,這個參數(shù)的單位是毫秒。
- 過期時間單位也是毫秒,但是與消息TTL不同在于 隊列TTL值必須大于零
/* 設(shè)置隊列過期時間*/
@Bean
public Exchange queueTimeOutExchange(){
return new DirectExchange("queueTimeOut.exchange.test",true,false);
}
// 聲明過期的隊列并定義隊列名稱
@Bean
public Queue queueTimeOutQueue(){
// 消息過期 特殊的args
Map<String,Object> args = new HashMap<>(16);
// 存活時間最大為 20 秒
args.put("x-message-ttl",20000);
// 設(shè)置隊列可以存儲的最大消息數(shù)量
args.put("x-max-length", 10);
return new Queue("queueTimeOut.queue.test"
,true,false,false,args);
}
@Bean
public Binding queueTimeOutBinding(){
return new Binding("queueTimeOut.queue.test",
Binding.DestinationType.QUEUE,
"queueTimeOut.exchange.test",
"key.queuetime.out",null);
}
對隊列設(shè)置過期時間文章來源:http://www.zghlxwxcb.cn/news/detail-700645.html
@Bean
public Queue queueTimeOutQueue(){
// 消息過期 特殊的args
Map<String,Object> args = new HashMap<>(16);
// 存活時間最大為 20 秒
args.put("x-message-ttl",20000);
// 設(shè)置隊列可以存儲的最大消息數(shù)量
args.put("x-max-length", 10);
return new Queue("queueTimeOut.queue.test"
,true,false,false,args);
}
一旦消息過期,就會從隊列中抹去。因為隊列中已過期的消息肯定在隊列頭部,RabbitMQ只要定期從隊頭開始掃描是否有過期消息即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-700645.html
到了這里,關(guān)于Springboot與RabbitMQ消息超時時間、隊列消息超時時間的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!