目錄
1. 上文傳送門:?
2. 前言簡介:?
2.1 問: 消費端重復循環(huán)異常如何解決?
2.2 為什么要使用死信隊列
2.3 案例思路
-> ps: 以下案例經(jīng)過測試(思路一/二實現(xiàn)原理一樣)
-> 2.3.1 思路一?
-> 2.3.2 思路二
3. 案例代碼
3.1 簡單介紹案例
3.2 聲明交換機 隊列 以及綁定路由鍵
3.3 修改配置文件
3.4 發(fā)送消息
?3.5 接收消息(自動確認)
3.6 開啟測試代碼
3.7 測試結(jié)果
---> 3.7.1 查看交換機
?---> 3.7.2 查看隊列?編輯
?---> 3.7.3 主要查看方向
---> 3.7.4 另外遇到問題 別慌
1. 上文傳送門:?
微服務: 00-rabbitmq出現(xiàn)的異常以及解決方案
微服務: 01-rabbitmq的應用場景及安裝(docker)
微服務: 02-rabbitmq在springboot中如何使用(上篇)
微服務: 03-rabbitmq在springboot中如何使用(下篇)
微服務: 04-springboot中rabbitmq配置,消息回收,序列化方式
2. 前言簡介:?
上面文章是安裝, 基礎測試案例, 下面是進階的第一篇文章
本篇主要介紹自動確認進入死信隊列
手動確認在下一篇介紹
2.1 問: 消費端重復循環(huán)異常如何解決?
使用 RabbitMQ 的重試機制,當消費者處理消息失敗時,可以將消息重新放回隊列中,并設置一定的重試次數(shù)和重試時間間隔。如果超過了重試次數(shù)仍然處理失敗,則可以將消息放入死信隊列中,方便后續(xù)處理
2.2 為什么要使用死信隊列
無法被消費的消息, 這樣的消息如果沒有后續(xù)的處理,就會一直在正常隊列里重復重試, 所以加入私信隊列后 進行人工補償, 也可以分等級 哪些重要消息需要優(yōu)先處理
2.3 案例思路
-> ps: 以下案例經(jīng)過測試(思路一/二實現(xiàn)原理一樣)
-> 2.3.1 思路一?
?兩個交換機(一個正常exchange 一個死信exchange)
?兩個隊列(正常queue,死信queue) 一個隊列一個路由鍵
?正常交換機綁定正常queue 綁定路由鍵?同理
-> 2.3.2 思路二
一個交換機? 兩個不同路由鍵 然后綁定(本文使用)
3. 案例代碼
3.1 簡單介紹案例
服務A發(fā)起請求到 rabbitmq,? 服務B監(jiān)聽并處理消息, 報錯了, 重試了五次還不行后 , 進入死信隊列
3.2 聲明交換機 隊列 以及綁定路由鍵
@Bean
public DirectExchange pzyExchange() {
// return new DirectExchange("pzy_exchange", true, false);
return ExchangeBuilder.directExchange("pzy_exchange").build();
}
@Bean
public Queue deadLetterQueue() {
return QueueBuilder.durable("order_dead_queue").build();
}
@Bean
public Binding deadBinding(Queue deadLetterQueue, DirectExchange pzyExchange) {
return BindingBuilder.bind(deadLetterQueue).to(pzyExchange).with("orderDeadRoutingKey");
}
@Bean
public Binding normalBinding(Queue normalLetterQueue, DirectExchange pzyExchange) {
return BindingBuilder.bind(normalLetterQueue).to(pzyExchange).with("orderNormalRoutingKey");
}
@Bean
public Queue normalLetterQueue() {
Map<String, Object> arguments = new HashMap<>(3);
arguments.put("x-dead-letter-exchange", "pzy_exchange");
arguments.put("x-dead-letter-routing-key", "orderDeadRoutingKey");
arguments.put("x-max-length", 200);
return QueueBuilder.durable("order_normal_queue").withArguments(arguments).build();
}
3.3 修改配置文件
微服務: 04-springboot中rabbitmq配置,消息回收,序列化方式
3.4 發(fā)送消息
rabbitTemplate.convertAndSend("pzy_exchange", "orderNormalRoutingKey", "我是消息");
?3.5 接收消息(自動確認)
自動確認, 在重試結(jié)束后, 自動進入死信隊列
(手動確認的下文在介紹)
@RabbitListener(queues = "#{normalLetterQueue.name}")
public void oldHoldInNewPurchaseData(Message message, String message1, Channel channel) throws IOException {
log.info("獲取到mq消息,消息內(nèi)容為{}", message);
log.info("mq接收到的對象===>{}", aixiPurchaseRequestDTO);
// System.out.println(map);
try {
// int i = new Random().nextInt(5);
// if (i > 1) throw new OrderServiceException(ResponseEnum.E40008, "后端測試報錯回收機制!");//60% 概率報錯
// if (true) throw new OrderServiceException(ResponseEnum.E40008, "后端測試報錯回收機制!");//100% 報錯
// channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
e.printStackTrace();
log.error("異常===> {}", e.getMessage());
throw new OrderServiceException(ResponseEnum.E40008, e.getMessage());
} finally {
// channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
}
}
3.6 開啟測試代碼
第一個判斷(60%): 是查看是否在第一次報錯后續(xù)消費成功后 是否進入死信隊列
第二個判斷(100%): 是測試重試機制(次數(shù))過后 是否進入死信隊列
拋出 throw new RuntimeException("測試報錯!") 就可以
int i = new Random().nextInt(5);
if (i > 1) throw new OrderServiceException(ResponseEnum.E40008, "后端測試報錯回收機制!");//五分之三概率報錯
//if (true) throw new OrderServiceException(ResponseEnum.E40008, "后端測試報錯回收機制!");//五分之三概率報錯
3.7 測試結(jié)果
---> 3.7.1 查看交換機
有沒有綁定兩個路由鍵(沒有查看綁定配置)
?---> 3.7.2 查看隊列
?---> 3.7.3 主要查看方向
查看是不是最后一次報錯后 才進入死信隊列
報錯異常是不是無限制循環(huán)報錯
---> 3.7.4 另外遇到問題 別慌
先把交換機和隊列都刪了 然后再重試
[如果生產(chǎn)者和消費者配置是獨立的 看看隊列聲明時是否相同, 不同刪了隊列重啟項目]文章來源:http://www.zghlxwxcb.cn/news/detail-583041.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-583041.html
到了這里,關于微服務: 05-rabbitmq設置重試次數(shù)并設置死信隊列的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!