最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RabbitMQ中的死信隊列(Dead Letter Exchanges)詳解

 更新時間:2023年12月12日 09:29:54   作者:warybee  
這篇文章主要介紹了RabbitMQ中的死信隊列(Dead Letter Exchanges)詳解,當RabbitMQ出現(xiàn)死信,可能會導致業(yè)務邏輯錯誤,比如下訂單后修改庫存操作,在下單后因為某種原因,發(fā)送的消息未被簽收,這時庫存數(shù)據(jù)會出現(xiàn)不一致,需要的朋友可以參考下

RabbitMQ死信隊列

1. 介紹

當消息在一個隊列中變?yōu)樗佬藕螅恢匦掳l(fā)送到另一個Exchange。

2. 在什么情況下會出現(xiàn)死信

  • 消息未被簽收,在消費端使用了 basic.reject 或 basic.nack ,并且requeue設置為false
  • 消息過期(TTL)
  • 消息隊列達到了最大長度

3. 實際應用

當RabbitMQ出現(xiàn)死信,可能會導致業(yè)務邏輯錯誤,比如下訂單后修改庫存操作,在下單后因為某種原因,發(fā)送的消息未被簽收,這時庫存數(shù)據(jù)會出現(xiàn)不一致。

有死信隊列之后我們就可以監(jiān)聽死信隊列,來處理業(yè)務邏輯。

3.1 死信隊列設置

聲明隊列,添加參數(shù)x-dead-letter-exchange

Map<String, Object> agruments = new HashMap<String, Object>();
agruments.put("x-dead-letter-exchange", "dlx.exchange");
//這個agruments屬性,要設置到聲明隊列上
channel.queueDeclare(queueName, true, false, false, agruments);

死信隊列,是一個普通的Exchange和queue,需要設置死信Exchange和queue,并進行綁定

/要進行死信隊列的聲明:
		channel.exchangeDeclare("dlx.exchange", "topic", true, false, null);
		channel.queueDeclare("dlx.queue", true, false, false, null);
		//可以匹配任意routeKey
		channel.queueBind("dlx.queue", "dlx.exchange", "#");

4 代碼實現(xiàn)

生產(chǎn)端

public static void main(String[] args) throws Exception {
		ConnectionFactory connectionFactory = new ConnectionFactory();
		connectionFactory.setHost("127.0.0.1");
		connectionFactory.setPort(5672);
		connectionFactory.setVirtualHost("/");
		Connection connection = connectionFactory.newConnection();
		Channel channel = connection.createChannel();
		String exchange = "test_dlx_exchange";
		String routingKey = "dlx.test";
		String msg = "RabbitMQ DLX Message test";
		for(int i =0; i<1; i ++){
			AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
					.deliveryMode(2)
					.contentEncoding("UTF-8")
					.expiration("10000") //過期時間為1秒
					.build();
			channel.basicPublish(exchange, routingKey, true, properties, msg.getBytes());
		}
	}

消費端

public static void main(String[] args) throws Exception {
		ConnectionFactory connectionFactory = new ConnectionFactory();
		connectionFactory.setHost("192.168.11.76");
		connectionFactory.setPort(5672);
		connectionFactory.setVirtualHost("/");
		Connection connection = connectionFactory.newConnection();
		Channel channel = connection.createChannel();
		// 這就是一個普通的交換機 和 隊列 以及路由
		String exchangeName = "test_dlx_exchange";
		String routingKey = "dlx.#";
		String queueName = "test_dlx_queue";
		channel.exchangeDeclare(exchangeName, "topic", true, false, null);
		Map<String, Object> agruments = new HashMap<String, Object>();
		agruments.put("x-dead-letter-exchange", "dlx.exchange");
		//這個agruments屬性,要設置到聲明隊列上
		channel.queueDeclare(queueName, true, false, false, agruments);
		channel.queueBind(queueName, exchangeName, routingKey);
		//要進行死信隊列的聲明:
		channel.exchangeDeclare("dlx.exchange", "topic", true, false, null);
		channel.queueDeclare("dlx.queue", true, false, false, null);
		//可以匹配任意routeKey
		channel.queueBind("dlx.queue", "dlx.exchange", "#");
	   channel.basicConsume(queueName, true, new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    System.out.println("接收到消息::"+new String(body));
                }
            });
	}

運行以上代碼,在交換機(Exchange)中會多出一個名為dlx.exchange 類型為topic的交換機,隊列中也有一個dlx.queue 隊列。

到此這篇關于RabbitMQ中的死信隊列(Dead Letter Exchanges)詳解的文章就介紹到這了,更多相關RabbitMQ死信隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • maven解決依賴沖突的三種解決方法

    maven解決依賴沖突的三種解決方法

    依賴沖突是指項目依賴的某一個jar包,有多個不同的版本,因而造成了包版本沖突,本文主要介紹了maven解決依賴沖突的三種解決方法,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • idea?maven項目啟動項目不編譯target?文件的問題及解決方法

    idea?maven項目啟動項目不編譯target?文件的問題及解決方法

    代碼編輯器中無編譯錯誤,通過maven 的clean 、compile、package進行各種操作也都沒問題,但是單擊綠色箭頭運行(默認會先執(zhí)行IDE本身的Build操作)卻報:程序包xxx不存在,這篇文章主要介紹了解決idea maven項目啟動項目不編譯target文件問題,需要的朋友可以參考下
    2023-05-05
  • 最新IntelliJ IDEA 2020版本的安裝教程詳解

    最新IntelliJ IDEA 2020版本的安裝教程詳解

    這篇文章主要介紹了最新IntelliJ IDEA 2020版本的安裝教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • 在Linux上搭建一個Java部署環(huán)境的詳細步驟

    在Linux上搭建一個Java部署環(huán)境的詳細步驟

    這篇文章主要介紹了在Linux上搭建一個Java部署環(huán)境,安裝jdk有很多種方式,但是我們這里推薦的是使用yum直接安裝openjdk,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • SpringBoot使用SSE進行實時通知前端的實現(xiàn)代碼

    SpringBoot使用SSE進行實時通知前端的實現(xiàn)代碼

    這篇文章主要介紹了SpringBoot使用SSE進行實時通知前端,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • mybatis-plus報錯net.sf.jsqlparser.statement.select.SelectBody的問題解決

    mybatis-plus報錯net.sf.jsqlparser.statement.select.SelectBody的

    本文主要介紹了mybatis-plus報錯net.sf.jsqlparser.statement.select.SelectBody的問題解決,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • Spring元注解@HttpExchange聲明式調(diào)用HTTP

    Spring元注解@HttpExchange聲明式調(diào)用HTTP

    這篇文章主要介紹了Spring元注解@HttpExchange聲明式調(diào)用HTTP,Spring?Framework6和Spring?Boot3引入了聲明式HTTP客戶端@HttpExchange,通過接口注解簡化REST?API調(diào)用,核心注解包括@GetExchange、@PostExchange等對應HTTP方法,支持路徑參數(shù)和請求體,需要的朋友可以參考下
    2025-10-10
  • Java中的interrupt、interrupted和isInterrupted方法區(qū)別詳解

    Java中的interrupt、interrupted和isInterrupted方法區(qū)別詳解

    這篇文章主要介紹了Java中的interrupt、interrupted和isInterrupted方法區(qū)別詳解,interrupt用于中斷線程,調(diào)用該方法的線程的狀態(tài)將會被設置為中斷狀態(tài),線程中斷僅僅是設置線程的中斷狀態(tài)位,并不會停止線程,需要用戶自己去監(jiān)視線程的狀態(tài)并作出處理,需要的朋友可以參考下
    2023-12-12
  • MyBatis圖文并茂講解注解開發(fā)一對一查詢

    MyBatis圖文并茂講解注解開發(fā)一對一查詢

    這篇文章主要介紹了SpringBoot中Mybatis注解一對一查詢的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 在SpringBoot中記錄用戶操作日志功能

    在SpringBoot中記錄用戶操作日志功能

    在Web應用程序開發(fā)中,記錄用戶操作日志是一項非常重要的任務,它可以幫助我們追蹤用戶行為,分析系統(tǒng)狀況,以及審計系統(tǒng)的安全性,本文將介紹如何在SpringBoot框架中實現(xiàn)用戶操作日志的記錄功能,感興趣的朋友一起看看吧
    2024-12-12

最新評論

伊川县| 加查县| 嘉峪关市| 双峰县| 大庆市| 西平县| 衡阳市| 浦城县| 怀来县| 万源市| 西华县| 扶余县| 马龙县| 安阳市| 邢台县| 张掖市| 岑溪市| 禄劝| 英吉沙县| 杭州市| 石河子市| 望谟县| 漾濞| 渑池县| 贵阳市| 门头沟区| 友谊县| 资兴市| 绍兴县| 米易县| 冕宁县| 科尔| 鄂州市| 高雄县| 林芝县| 双城市| 集安市| 林西县| 电白县| 如皋市| 安泽县|