rabbitMQ發布確認-交換機不存在或者無法抵達隊列的緩存處理

rabbitMQ在發送消息時,會出現交換機不存在(交換機名字寫錯等消息),這種情況如何會退給生產者重新處理?【交換機層】
生產者發送消息時,消息未送達到指定的隊列,如何消息回退?

核心:對類RabbitTemplate.ConfirmCallback 和RabbitTemplate.ReturnCallback的重寫。

RabbitTemplate.ConfirmCallback:交換機在收到消息或者沒收到消息時會被觸發
RabbitTemplate.ReturnCallback:消息進入交換機,不能達到指定目的地時被出發。

開啟交換機確認
開啟消息不可達回退

配置文件不開啟 這兩項

spring:rabbitmq:
#    交換機進行確認消息publisher-confirm-type: correlated
#   交換機不可以路由消息時 消息回退publisher-returns: true
配置類聲明
package com.esint.configs;import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 發布確認**/
@Configuration
public class ConfirmConfig {//交換機public static final String CONFIRM_EXCHANGE = "confirm.exchange";//隊列public static final String CONFIRM_QUEUE = "confirm.queue";//routing-keypublic static final String CONFIRM_ROUTING_KEY = "key1";//聲明 交換機@Bean("confirmExchange")public DirectExchange confirmExchange(){return new DirectExchange(CONFIRM_EXCHANGE);}//聲明 隊列@Bean("confrimQueue")public Queue confrimQueue(){return QueueBuilder.durable(CONFIRM_QUEUE).build();}//綁定@Beanpublic Binding queueBindingExchange(@Qualifier("confrimQueue") Queue confrimQueue,@Qualifier("confirmExchange") DirectExchange confirmExchange){return  BindingBuilder.bind(confrimQueue).to(confirmExchange).with(CONFIRM_ROUTING_KEY);}
}

消費者:

package com.esint.controller;import com.esint.configs.ConfirmConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RestController
@RequestMapping("/confirm")
public class ProducerController {@Autowiredprivate RabbitTemplate rabbitTemplate;//發消息@GetMapping("/sendMessage/{message}")public void sendMessage(@PathVariable String message){//普通發送模式 無是否發送成功回調CorrelationData correlationData = new CorrelationData("101");rabbitTemplate.convertAndSend(ConfirmConfig.CONFIRM_EXCHANGE,ConfirmConfig.CONFIRM_ROUTING_KEY+"123",message);log.info("發送消息為:{}",message);}}

消費者:

package com.esint.consumer;import com.esint.configs.ConfirmConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class Consumer {@RabbitListener(queues = ConfirmConfig.CONFIRM_QUEUE)public void receiveConfrimMessage(Message message){log.info("接收到的消息為:" + new String(message.getBody()));}
}
核心修改的重寫的類:
package com.esint.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Slf4j
@Component
public class MyCallBack implements RabbitTemplate.ConfirmCallback ,RabbitTemplate.ReturnCallback{/***  注入:本類為實現了RabbitTemplate的內部類,所以在RabbitTemplate發送消息的時候不會調用到我們自己的實現,所以需要把這個類在注入到RabbitTemplate中。*/@Autowiredprivate RabbitTemplate rabbitTemplate;@PostConstructpublic void init(){rabbitTemplate.setConfirmCallback(this);rabbitTemplate.setReturnCallback(this);}/*** RabbitTemplate.ConfirmCallback  是在【生產者】發送【交換機】 交換機的感知回應調去方法** 交換機確認回調方法* 1.交換機接收消息成功*   參數1  correlationData保存了回調消息ID和相關信息*   參數2  交換機收到消息 true*   參數3  失敗原因 為 null* 2.交換機接受消息失敗*   參數1  correlationData保存了回調消息ID和相關信息*   參數2  交換機收到消息 false*   參數3  失敗原因* @param correlationData  來源于生產者 所以在發消息時 需要帶有這個屬性* @param ack* @param cause*/@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {String id = correlationData != null ? correlationData.getId() : "";if(ack){log.info("交換機確認收到 ID:{}" ,id);}else {log.info("交換機未收到ID:{}的消息,原因:{}",id,cause);//這里實現發送交換機失敗的存儲邏輯}}/*** 回退消息* 在消息傳遞過程不可達目標地時 返還給生產者  只有消息不可達,才會執行這個方法** @param message* @param replyCode* @param replyText* @param exchange* @param routingKey*/@Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {log.error("消息{} 被交換機{} 退回,原因:{} 路由:{}",new String(message.getBody()),exchange,replyText,routingKey);//這里實現發送消息不到達的邏輯 發送消息無法被邏輯 默認就會被交換機丟掉 這里重寫后 可以在這里處理存儲}
}

故意發送一個錯誤路由時:
在這里插入圖片描述
消息能發出 交換機有確認 消息可以被回退

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166531.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166531.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166531.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

麒麟KYSEC使用方法05-命令設置密碼強度

原文鏈接:麒麟KYSEC使用方法05-命令設置密碼強度 hello,大家好啊,今天給大家帶來麒麟KYLINOS的kysec使用方法系列文章第五篇內容----使用命令設置密碼強度,密碼強度策略有兩個文件需要修改,pwquality.conf/login.defs&…

命令執行總結

之前做了一大堆的題目 都沒有進行總結 現在來總結一下命令執行 我遇到的內容 這里我打算按照過濾進行總結 依據我做過的題目 過濾system 下面是一些常見的命令執行內容 system() passthru() exec() shell_exec() popen() proc_open() pcntl_exec() 反引號 同shell_exec() …

大語言模型概述(三):基于亞馬遜云科技的研究分析與實踐

上期介紹了基于亞馬遜云科技的大語言模型相關研究方向,以及大語言模型的訓練和構建優化。本期將介紹大語言模型訓練在亞馬遜云科技上的最佳實踐。 大語言模型訓練在亞馬遜云科技上的最佳實踐 本章節內容,將重點關注大語言模型在亞馬遜云科技上的最佳訓…

解決Chrome瀏覽器無法啟動,因為應用程序的并行配置不正確

目錄 現象 方法1 方法2 附帶:書簽路徑 一次比較奇怪的問題,花了一些時間,記錄下來。 現象 進到本機默認安裝路徑: C:\Users\你的用戶名\AppData\Local\Google\Chrome\Application 下面會有個版本號的目錄,如我的…

跨地區企業組網方案對比與推薦

跨地區的企業,需要在不同的辦公室之間實現內部通信來進行業務協作。然而,在不同的地方建立局域網并將它們連接起來是一個棘手的問題。傳統的企業組網方案可能會面臨各種挑戰,包括網絡延遲、數據安全性、維護困難等等。 常見的組網方案有&…

快手ConnectionError

因為運行的程序被中斷導致 top然后查看站用處內存高的accelerate kill進程號 9回車

linux基礎5:linux進程1(馮諾依曼體系結構+os管理+進程狀態1)

馮諾依曼體系結構os管理 一.馮諾依曼體系結構:1.簡單介紹(準備一)2.場景:1.程序的運行:2.登錄qq發送消息: 3.為什么需要內存:1.簡單的引入:2.計算機存儲體系:3.內存的意義…

微服務知識小結

1. SOA、分布式、微服務之間有什么關系和區別? 1.分布式架構指將單體架構中的各個部分拆分,然后部署到不同的機器或進程中去,SOA和微服務基本上都是分布式架構的 2. SOA是一種面向服務的架構,系統的所有服務都注冊在總線上&#…

讓工作效率提升10倍:十大AIGC工具評測【建議收藏】

AI技術的普及已經在近年來不斷增長。這種技術已經改變了我們與電腦的互動方式,讓我們能夠更高效、更自然地完成任務。本文將展示10個基于ChatGPT、GPT-3.5和 GPT-4.0 AI模型構建的最強大的資源,使您更容易充分利用它們的潛力。因此,如果您想利…

詳解深度學習中的圖神經網絡GNN

引言 圖神經網絡GNN是深度學習的一個分支。 深度學習的四個分支對應了四種常見的數據格式,前饋神經網絡FNN處理表格數據,表格數據可以是特征向量,卷積神經網絡CNN處理圖像數據,循環神經網絡RNN處理時序數據,圖神經網…

android的canvas的clipRegion廢棄替代代碼

由于clipRegion的一些問題,導致他被廢棄了,但又有時候會用到,所以寫了一個工具類來替代它 代碼如下 package com.example;import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.g…

c++|類和對象(上)

目錄 一、面向過程和面向對象初步認識 二、類的引入和定義 2.1類的引入 2.2類的定義 三、類的訪問限定符及封裝 3.1訪問限定符 3.2封裝 四、類的作用域 五、類的實例化 六、類的對象大小的計算 6.1如何計算對象的大小 6.2類對象的存儲方式 七、類成員函數的thi…

【Docker】從零開始:7.Docker命令:容器命令及參數詳解

【Docker】從零開始:7.幫助啟動類命令 一、幫助啟動類命令啟動Docker停止Docker重啟Docker查看Docker狀態開機啟動查看docker概要信息查看docker總體幫助文檔查看docker命令幫助文檔 二、鏡像命令列出本地主機上的鏡像運行示例返回說明操作參數 搜索倉庫里的某個鏡像…

Python-Django的“日志功能-日志模塊(logging模塊)-日志輸出”的功能詳解

01-綜述 可以使用Python內置的logging模塊來實現Django項目的日志記錄。 所以與其說這篇文章在講Django的“日志功能-日志模塊-日志輸出”,不如說是在講Pthon的“日志功能-日志模塊-日志輸出”,即Python的logging模塊。 下面用一個實例來進行講解。 …

2023年亞太杯數學建模A題水果采摘機器人的圖像識別功能(免費思路)

中國是世界上最大的蘋果生產國,年產量約為 3500 萬噸。同時,中國也是世界上最大的蘋果出口國,世界上每兩個蘋果中就有一個出口到國。世界上每兩個蘋果中就有一個來自中國,中國出口的蘋果占全球出口量的六分之一以上。來自中國。中…

保護服務器免受攻擊:解析攻擊情境與解決之道

在數字化時代,服務器安全問題日益突出,因為它們是企業和個人網絡活動的核心。服務器被攻擊可能引發一系列問題,理解攻擊的不同情境以及采取相應的解決方法變得至關重要。 DDoS 攻擊(分布式拒絕服務攻擊) 情境&#xff…

基于51單片機超聲波測距汽車避障系統

**單片機設計介紹, 基于51單片機超聲波測距汽車避障系統 文章目錄 一 概要二、功能設計設計思路 三、 軟件設計原理圖 五、 程序六、 文章目錄 一 概要 基于51單片機的超聲波測距汽車避障系統是一種用于幫助汽車避免碰撞和發生事故的設備,以下是一個基本…

Visual Studio 2022安裝教程(千字圖文詳解),手把手帶你安裝運行VS2022以及背景圖設置

VS2022最新最全安裝教程 很高興你打開了這篇博客,接下來我們一起安裝并且使用VS2022吧 文章目錄 VS2022最新最全安裝教程一.官網下載二.安裝啟動三.項目測試1.創建新項目2.選擇我們使用的模板(C空項目),繼續沖!3.進入…

docker的使用方法

文章目錄 為什么要用dockerdocker安裝docker工作原理docker命令docker搭建練習docker可視化docker鏡像docker容器數據卷DockerFiledocker全流程Docker網絡原理docker composedocker swarm 為什么要用docker 官網:https://www.docker.com文檔地址:https:…