java實現(xiàn)Rabbitmq延遲隊列和惰性隊列
延遲隊列
當一個隊列中的消息滿足下列情況之一,可以成為死信:
(1)消費者使用basic.reject或basic.nack聲明消費失敗,并且消息的requeue參數(shù)設(shè)置為false
(2)消息是一個過期消息,超時無人消費
(3)要投遞的隊列消息堆積滿了,最早的消息可能成為死信
如果該隊列配置了dead-letter-exchange屬性,指定了一個交換機,那么隊列中的死信就會投遞到這個交換機中,而這個交換機稱為死信交換機。
如何給隊列綁定死信交換機?
(1)給隊列設(shè)置dead-letter-exchange屬性,指定一個交換機
(2)給隊列設(shè)置dead-letter-routing-key屬性,設(shè)置死信交換機與死信隊列的RoutingKey
TTL(Time-To-Live)。如果一個隊列中的消息TTL結(jié)束仍未消費,則會變?yōu)樗佬?,TTL超時分為兩種情況:
(1)消息所在的隊列設(shè)置了存活時間
(2)消息本身設(shè)置了存活時間
利用TTL結(jié)合死信交換機,實現(xiàn)了消息發(fā)出后,消費者延遲收到消息的效果。這種消息模式就稱為延遲隊列模式。
延遲隊列的使用場景包括:
(1)延遲發(fā)送短信
(2)用戶下單,如果用戶在15 分鐘內(nèi)未支付,則自動取消
(3)預約工作會議,20分鐘后自動通知所有參會人員
DelayExchange的本質(zhì)還是官方的三種交換機,只是添加了延遲功能。因此使用時只需要聲明一個交換機,交換機的類型可以是任意類型,然后設(shè)定delayed屬性為true即可。
基于注解的方式:
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "DelayQueue",durable = "true"),exchange = @Exchange(name = "delay-mq-exchange_B",delayed = "true"),key = "routingKey_delay"))
@Component
@Slf4j
public class DirectConsumer {
......
}
基于Java代碼的方式:
@Bean
public Exchange orderExchange(){
return ExchangeBuilder.topicExchange(RabbitMQExchanges.EXCHANGE_B.getExchange()).delayed().durable(true).build();
}
向delay為true的交換機中發(fā)送消息,一定要給消息添加一個header:x-delay,值為延遲的時間,單位為毫秒:
Message message= MessageBuilder.withBody(String.valueOf(content).getBytes(StandardCharsets.UTF_8)).setHeader("delay-one",500000).build();
惰性隊列
**消息堆積問題:**當生產(chǎn)者發(fā)送消息的速度超過了消費者處理消息的速度,就會導致隊列中的消息堆積,直到隊列存儲消息達到上限。最早接收到的消息,可能就會成為死信,會被丟棄,這就是消息堆積問題。
惰性隊列的特征如下:
(1)接收到消息后直接存入磁盤而非內(nèi)存
(2)消費者要消費消息時才會從磁盤中讀取并加載到內(nèi)存
(3)支持數(shù)百萬條的消息存儲
而要設(shè)置一個隊列為惰性隊列,只需要在聲明隊列時,指定x-queue-mode屬性為lazy即可。用SpringAMQP聲明惰性隊列分兩種方式:
基于注解的方式:
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "DelayQueue",durable = "true",arguments = @Argument(name = "x-dead-letter-exchange",value = "lazy")),exchange = @Exchange(name = "delay-mq-exchange_B",delayed = "true"),key = "routingKey_delay"))
基于Java代碼的方式:
@Bean
public Queue orderQueue(){
return QueueBuilder.durable(RabbitMQQueue.RABBIT_MQ_QUEUE_A.getQueue()).lazy().build();
}到此這篇關(guān)于java實現(xiàn)Rabbitmq延遲隊列和惰性隊列的文章就介紹到這了,更多相關(guān)java Rabbitmq延遲隊列和惰性隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot中實現(xiàn)策略模式+工廠模式的方法
這篇文章主要介紹了Springboot中實現(xiàn)策略模式+工廠模式,具體策略模式和工廠模式的UML我就不給出來了,使用這個這兩個模式主要是防止程序中出現(xiàn)大量的IF ELSE IF ELSE....,接下來咱們直接實現(xiàn)Springboot策略模式工廠模式2022-03-03
java 學習筆記(入門篇)_程序流程控制結(jié)構(gòu)和方法
程序流程控制結(jié)構(gòu)分為:順序、選擇、循環(huán)以及異常處理結(jié)構(gòu),語句是程序的基本組成單位,一般來說語句的執(zhí)行流程是按順序來進行的,但是當遇到一些特殊的條件,比如循環(huán),這時候語句就會按照流程控制結(jié)構(gòu)來進行了2013-01-01
使用SSM+Layui+Bootstrap實現(xiàn)汽車維保系統(tǒng)的示例代碼
本文主要實現(xiàn)對汽車維修廠的信息化管理功能,。實現(xiàn)的主要功能包含用戶管理、配置管理、汽車管理、故障管理、供應(yīng)商管理、配件管理、維修訂單管理、統(tǒng)計信息、公告管理、個人信息管理,感興趣的可以了解一下2021-12-12
Springboot整合多數(shù)據(jù)源配置流程詳細講解
這篇文章主要介紹了Springboot整合多數(shù)據(jù)源配置流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-03-03
關(guān)于Java應(yīng)用日志與Jaeger的trace關(guān)聯(lián)的問題
這篇文章主要介紹了Java應(yīng)用日志如何與Jaeger的trace關(guān)聯(lián),通過jaeger發(fā)現(xiàn)這十次請求中有一次耗時特別長,想定位一下具體原因,感興趣的朋友跟隨小編一起看看吧2022-01-01
Kafka單節(jié)點偽分布式集群搭建實現(xiàn)過程詳解
這篇文章主要介紹了Kafka單節(jié)點偽分布式集群搭建實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11
Java/Android 獲取網(wǎng)絡(luò)重定向文件的真實URL的示例代碼
本篇文章主要介紹了Java/Android 獲取網(wǎng)絡(luò)重定向文件的真實URL的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
SpringBoot集成WebSocket實現(xiàn)前后端消息互傳的方法
這篇文章主要介紹了SpringBoot集成WebSocket實現(xiàn)前后端消息互傳的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10

