RabbitMQ延時佇列的使用
延時佇列概述
通過給一個普通的佇列設定一些引數,死信交換機,死信路由,以及佇列過期時間,注意,這個佇列不能讓任何消費者監聽,然後我們將訊息統一發往這個佇列,當這個佇列中的訊息過期後,就會根據我們指定的死信交換機和死信路由去往新的佇列,我們的程式可以監聽這個佇列,一旦這個佇列監聽到訊息了,則一定是延時佇列中過期的訊息。
- 流程圖如下
延時佇列測試使用
- 引入AMQP的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
- 編寫一個配置類,給容器中注入一些bean,當容器啟動時,會自定根據這些bean去rabbit伺服器建立響應佇列與交換機。
@Slf4j
@Configuration
public class RabbitConfig {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
/**
* 建立延時佇列
*/
@Bean
public Queue orderDelayQueue(){
Map<String,Object> map = new HashMap<>();
//訊息過期後交給這個交換機處理
map.put("x-dead-letter-exchange","order-event-exchange");
//訊息過期後交給上面的交換機,該交換機再根據這個路由鍵轉發給那個處理訊息的佇列
map.put("x-dead-letter-routing-key","order.release.order");
//設定佇列的過期時間
map.put("x-message-ttl",60000);
Queue queue = new Queue("order.delay.queue",true,false,
false,map);
return queue;
}
/**
* 當延時佇列中的訊息過期時將訊息發往這個佇列
*/
@Bean
public Queue orderReleaseOrderQueue(){
Queue queue = new Queue("order.release.order.queue",true,false,
false,null);
return queue;
}
/**
* 交換機,這個交換機同時繫結延時佇列和訂單釋放佇列,需要根據不同的routing-key來轉發到不同的佇列
* 所以我們選擇用Topic型別交換機
*/
@Bean
public Exchange orderEventExchange(){
TopicExchange exchange = new TopicExchange(
"order-event-exchange",
true,
false,
null
) ;
return exchange;
}
/**
* 將交換機和佇列進行繫結,同時可以繫結兩個佇列
*/
@Bean
public Binding orderCreateOrder(){
return new Binding(
"order.delay.queue",
Binding.DestinationType.QUEUE,
"order-event-exchange",
"order.create.order", //延時佇列繫結的路由鍵,建立訂單時根據這個路由鍵傳送到延時佇列
null
);
}
@Bean
public Binding orderReleaseOrder(){
return new Binding(
"order.release.order.queue",
Binding.DestinationType.QUEUE,
"order-event-exchange",
"order.release.order", //消費佇列繫結的路由鍵,延時佇列中的訊息失效後根據這個路由鍵傳送給響應的佇列
null
);
}
/**
* 測試監聽佇列,監聽的是延時佇列過期後的處理佇列
*/
@RabbitListener(queues = "order.release.order.queue")
public void listener(Message message, OrderDTO orderDTO, Channel channel){
log.info("收到過期的訂單資訊,準備關閉訂單,{}",orderDTO);
}
}
- 其中我們在建立延時佇列時,傳遞了一個Map,這個map就是指定了我們延時佇列的一些屬性資訊。
登入rabbit伺服器檢視,order.delay.queue這個佇列確實多了這三個屬性。
相關文章
- 延時佇列(RabbitMQ)佇列MQ
- 使用 RabbitMQ 實現延時佇列MQ佇列
- RabbitMQ:偽延時佇列MQ佇列
- netcore下RabbitMQ佇列、死信佇列、延時佇列及小應用NetCoreMQ佇列
- 使用RabbitMq原生實現延遲佇列MQ佇列
- RabbitMQ實戰《延遲佇列》MQ佇列
- RabbitMQ 實現延遲佇列MQ佇列
- RabbitMQ實現延遲佇列MQ佇列
- Golang 實現 RabbitMQ 的延遲佇列GolangMQ佇列
- RabbitMQ高階之訊息限流與延時佇列MQ佇列
- Spring Boot(十四)RabbitMQ延遲佇列Spring BootMQ佇列
- RabbitMQ從零到叢集高可用(.NetCore5.0) - 死信佇列,延時佇列MQNetCore佇列
- RabbitMQ使用 prefetch_count優化佇列的消費,使用死信佇列和延遲佇列實現訊息的定時重試,golang版本MQ優化佇列Golang
- Kafka 延時佇列&重試佇列Kafka佇列
- RabbitMQ、RocketMQ、Kafka延遲佇列實現MQKafka佇列
- 如何用RabbitMQ實現延遲佇列MQ佇列
- 面試官:RabbitMQ過期時間設定、死信佇列、延時佇列怎麼設計?面試MQ佇列
- C#通過rabbitmq實現定時任務(延時佇列)C#MQ佇列
- 【RabbitMQ】一文帶你搞定RabbitMQ延遲佇列MQ佇列
- RabbitMQ釋出訂閱實戰-實現延時重試佇列MQ佇列
- php訂單延時處理-延時佇列PHP佇列
- lumen 8.0 使用 rabbitmq 佇列MQ佇列
- Delayed Message 外掛實現 RabbitMQ 延遲佇列MQ佇列
- Node.js結合RabbitMQ延遲佇列實現定時任務Node.jsMQ佇列
- RabbitMQ 佇列使用基礎教程MQ佇列
- RabbitMQ 學習筆記 -- 12 死信佇列 DLX + TTL 方式實現延遲佇列MQ筆記佇列
- 基於Redis的簡易延時佇列Redis佇列
- Redis 應用-非同步訊息佇列與延時佇列Redis非同步佇列
- 基於訊息佇列(RabbitMQ)實現延遲任務佇列MQ
- Springboot + rabbitMq佇列Spring BootMQ佇列
- Docker下RabbitMQ延時佇列實戰兩部曲之一:極速體驗DockerMQ佇列
- Docker下RabbitMQ延時佇列實戰兩部曲之二:細說開發DockerMQ佇列
- 訊息佇列的使用場景之RabbitMQ佇列MQ
- RabbitMQ 訊息佇列之佇列模型MQ佇列模型
- RabbitMQ .NET訊息佇列使用入門(五)【RabbitMQ例子】MQ佇列
- rabbitMQ 延遲佇列外掛強制呼叫ReturnCallback裡returnedMessage方法MQ佇列
- 訊息佇列-一篇讀懂rabbitmq(生命週期,confirm模式,延遲佇列,叢集)佇列MQ模式
- 一張圖帶你理解和實現RabbitMQ的延遲佇列功能MQ佇列