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

RabbitMQ消息有效期與死信的處理過程

 更新時間:2022年03月01日 10:30:08   作者:lss0555  
利用DLX,當消息在一個隊列中變成死信?(dead?message)?之后,它能被重新publish到另一個Exchange,這個Exchange就是DLX,本文重點給大家介紹RabbitMQ消息有效期與死信的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧

一.前言

RabbitMQ的TTL全稱為Time-To-Live,表示的是消息的有效期。消息如果在隊列中一直沒有被消費并且存在時間超過了TTL,消息就會變成了"死信" (Dead Message),后續(xù)無法再被消費了。如果不設置TTL,則表示此消息永久有效(默認消息是不會失效的)。如果將TTL設為0,則表示如果消息不能被立馬消費則會被立即丟掉,這個特性可以部分替代RabbitMQ3.0以前支持的immediate參數(shù),之所以所部分代替,是應為immediate參數(shù)在投遞失敗會有basic.return方法將消息體返回(這個功能可以利用死信隊列來實現(xiàn))。

設置TTL有兩種方式:

  • 隊列有效期:是聲明隊列的時候,在隊列的屬性中設置,這樣該隊列中的消息都會有相同的有效期
  • 消息有效期:發(fā)送消息時給消息設置屬性,可以為每條消息都設置不同的TTL

如果兩種方式都設置了,則以設置的較小的為準。

  • 區(qū)別:如果聲明隊列時設置了有效期,則消息過期了就會被刪掉;如果是發(fā)消息時設置的有效期,消息過期了也不會被立馬刪掉,因為這時消息是否過期是在要投遞給消費者時判斷的。

二.設置消息有效期

1.設置隊列的有效期TTL

定義隊列的方法如下:

Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
                                 Map<String, Object> arguments) throws IOException;

該方法的arguments參數(shù)可以設置隊列的屬性,屬性名為x-message-ttl,單位為毫秒。后臺添加的話如下:

在這里插入圖片描述

代碼中設置如下:

Map<String, Object> arguments= new HashMap<String , Object>();
arguments.put("x-message-ttl " , 10000);//10秒鐘  單位為毫秒
channel.queueDeclare(queueName , durable , exclusive , autoDelete , arguments) ;

命令行模式來設置:

rabbitmqctl set_policy TTL ".*" '{"message-ttl":100000}' --apply-to queues

通過HTTP接口調(diào)用:

$ curl -i -u guest:guest -H "content-type:application/json"  -XPUT -d'{"auto_delete":false,"durable":true,"arguments":{"x-message-ttl": 100000}}' 
http://ip:15672/api/queues/{vhost}/{queuename}

2.設置隊列的有效期Expire

有效期Expire可以讓隊列在指定時間內(nèi) “未被使用” 的話會自動過期刪除,未使用的意思是 queue 上沒有任何 consumer,queue 沒有被重新聲明,并且在過期時間段內(nèi)未調(diào)用過 basic.get 命令。該方式可用于,例如,RPC-style 的回復 queue, 其中許多queue 會被創(chuàng)建出來,但是卻從未被使用。

服務器會確保在過期時間到達后 queue 被刪除,但是不保證刪除的動作有多么的及時。在服務器重啟后,持久化的queue 的超時時間將重新計算。 x-expires 參數(shù)值以毫秒為單位,并且服從和 x-message-ttl 一樣的約束條件,且不能設置為 0 。所以,如果該參數(shù)設置為 10000 ,則表示該 queue 如果在 10s之內(nèi)未被使用則會被刪除。

代碼如下:

Map<String, Object> args = new HashMap<String, Object>();  
args.put("x-expires", 10000); 
channel.queueDeclare("queue", false, false, false, args);  

3.通過發(fā)送消息時設置有效期

發(fā)送消息的方法如下:

void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) throws IOException;

在該方法的props參數(shù)可以設置其有效期:

       Map<String, Object> headers = new HashMap<String, Object>();
                        AMQP.BasicProperties properties = new AMQP.BasicProperties().builder()
                                .deliveryMode(2) // 消息持久
                                .contentEncoding("UTF-8") // 編碼方式
                                .contentType("text/plain")
                                .expiration("100000")
                                .headers(headers)
                                .build();
      channel.basicPublish("", queueName, properties, message.getBytes());

通過HTTPAPI 接口設置:

$ curl -i -u guest:guest -H "content-type:application/json"  -XPOST -d
'{"properties":{"expiration":"100000"},"routing_key":"routingkey","payload":"bodys","payload_encoding":"string"}'  
http://localhost:15672/api/exchanges/{vhost}/{exchangename}/publish

三.死信交換機DLX

介紹

  • 死信隊列:DLX,dead-letter-exchange
  • 利用DLX,當消息在一個隊列中變成死信 (dead message) 之后,它能被重新publish到另一個Exchange,這個Exchange就是DLX

消息變成死信幾種情況

  • 消息被拒絕(Basic.Reject/Basic.Nack) ,井且設置requeue 參數(shù)為false
  • 消息過期
  • 隊列達到最大長度

死信處理過程

  • DLX也是一個正常的Exchange,和一般的Exchange沒有區(qū)別,它能在任何的隊列上被指定,實際上就是設置某個隊列的屬性。
  • 當這個隊列中有死信時,RabbitMQ就會自動的將這個消息重新發(fā)布到設置的Exchange上去,進而被路由到另一個隊列。
  • 可以監(jiān)聽這個隊列中的消息做相應的處理。

用途

通過監(jiān)控消費死信隊列中消息,來觀察和分析數(shù)據(jù)。
結(jié)合TTL實現(xiàn)延遲隊列(比如下單超過多長時間自動關(guān)閉)

使用

代碼如下:

channel.exchangeDeclare("dlx_exchange" , "direct"); //創(chuàng)建DLX: dlx_exchange
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-dead-letter-exchange" , "dlx_exchange ");//設置死信交換機
args.put("x-dead-letter-routing-key" , "dlx-routing-key");//設置DLX的路由鍵(可以不設置)
channel.queueDeclare("myqueue" , false , false , false , args);

實例

public static void main(String[] args) throws Exception {
		Connection connection = ConnectionUtil.getConnection();
		Channel channel = connection.createChannel();
		//聲明一個交換機,做死信交換機用
		channel.exchangeDeclare("dlx_exchange", "topic", true, false, null);
		//聲明一個隊列,做死信隊列用
		channel.queueDeclare("dlx_queue", true, false, false, null);
		//隊列綁定到交換機上
		channel.queueBind("dlx_queue", "dlx_exchange", "dlx.*");
		
		channel.exchangeDeclare("normal_exchange", "fanout", true, false, null);
		Map<String, Object> arguments=new HashMap<String, Object>();
		arguments.put("x-message-ttl" , 1000);//設置消息有效期1秒,過期后變成私信消息,然后進入DLX
		arguments.put("x-dead-letter-exchange" , "dlx_exchange");//設置DLX
		arguments.put("x-dead-letter-routing-key" , "dlx.test");//設置DLX的路由鍵
		//為隊列normal_queue 添加DLX
		channel.queueDeclare("normal_queue", true, false, false, arguments);
		channel.queueBind("normal_queue", "normal_exchange", "");
		channel.basicPublish("normal_exchange", "", MessageProperties.PERSISTENT_TEXT_PLAIN, ("測試死信消息").getBytes());
		System.out.println("發(fā)送消息時間:"+ConnectionUtil.formatDate(new Date()));
		channel.close();
		connection.close();
	}

說明:

申明死信隊列dlx_queue的綁定如下,與死信交換機dlx_exchange(topic類型)進行綁定,routing key為"dlx.*"
申明隊列normal_queue,與交換機normal_exchange(fanout類型)進行綁定

執(zhí)行流程:

  • 消息發(fā)送到交換機normal_exchange,然后路由到隊列normal_queue上
  • 因為隊列normal_queue沒有消費者,消息過期后成為死信消息
  • 死信消息攜帶設置的x-dead-letter-routing-key=dlx.test進入到死信交換機dlx_exechage
  • dlx_exechage與dlx_queue綁定的routing key為"dlx.*",死信消息的路由鍵dlx.test符合該規(guī)則被路由到dlx.queue上面。

參考:

https://www.jianshu.com/p/986ee5eb78bc

https://blog.csdn.net/u012988901/article/details/88958654

到此這篇關(guān)于RabbitMQ之消息有效期與死信的文章就介紹到這了,更多相關(guān)RabbitMQ消息有效期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java并發(fā)編程總結(jié)——慎用CAS詳解

    Java并發(fā)編程總結(jié)——慎用CAS詳解

    下面小編就為大家?guī)硪黄狫ava并發(fā)編程總結(jié)——慎用CAS詳解。小編覺得挺不錯的, 現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 淺談Java反射與代理

    淺談Java反射與代理

    下面小編就為大家?guī)硪黄獪\談Java反射與代理。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • java校驗json的格式是否符合要求的操作方法

    java校驗json的格式是否符合要求的操作方法

    在日常開發(fā)過程中,會有這樣的需求,校驗某個json是否是我們想要的數(shù)據(jù)格式,這篇文章主要介紹了java校驗json的格式是否符合要求,需要的朋友可以參考下
    2023-04-04
  • Java使用openssl檢測網(wǎng)站是否支持ocsp

    Java使用openssl檢測網(wǎng)站是否支持ocsp

    OCSP在線證書狀態(tài)協(xié)議是為了替換CRL而提出來的。對于現(xiàn)代web服務器來說一般都是支持OCSP的,OCSP也是現(xiàn)代web服務器的標配,這篇文章主要介紹了Java使用openssl檢測網(wǎng)站是否支持ocsp,需要的朋友可以參考下
    2022-07-07
  • Spring框架中IoC容器與DI依賴注入教程

    Spring框架中IoC容器與DI依賴注入教程

    IOC也是Spring的核心之一了,之前學的時候是采用xml配置文件的方式去實現(xiàn)的,后來其中也多少穿插了幾個注解,但是沒有說完全采用注解實現(xiàn)。那么這篇文章就和大家分享一下,全部采用注解來實現(xiàn)IOC + DI
    2023-01-01
  • java中的transient關(guān)鍵字解讀

    java中的transient關(guān)鍵字解讀

    這篇文章主要介紹了java中的transient關(guān)鍵字解讀,transient關(guān)鍵字的主要作用就是讓某些被transient關(guān)鍵字修飾的成員屬性變量不被序列化,實際上也正是因此,在學習過程中很少用得上序列化操作,一般都是在實際開發(fā)中,需要的朋友可以參考下
    2023-09-09
  • JAVA實現(xiàn)較完善的布隆過濾器的示例代碼

    JAVA實現(xiàn)較完善的布隆過濾器的示例代碼

    這篇文章主要介紹了JAVA實現(xiàn)較完善的布隆過濾器的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Java 注解學習筆記

    Java 注解學習筆記

    一直都在使用注解,但是一直都沒有用的很明白,后來被逼的發(fā)現(xiàn)不搞明白真的就沒有辦法愉快的寫代碼了,所以,這篇《Java中的注解學習筆記》就呼之欲出了
    2020-10-10
  • java中重載,繼承,重寫和多態(tài)的區(qū)別

    java中重載,繼承,重寫和多態(tài)的區(qū)別

    這篇文章主要介紹了java中重載,繼承,重寫和多態(tài)的區(qū)別,需要的朋友可以參考下
    2014-07-07
  • java、js中實現(xiàn)無限層級的樹形結(jié)構(gòu)方法(類似遞歸)

    java、js中實現(xiàn)無限層級的樹形結(jié)構(gòu)方法(類似遞歸)

    下面小編就為大家?guī)硪黄猨ava、js中實現(xiàn)無限層級的樹形結(jié)構(gòu)方法(類似遞歸)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11

最新評論

开平市| 措勤县| 阳东县| 宾川县| 酉阳| 博湖县| 凌云县| 丽水市| 启东市| 晋中市| 随州市| 乌审旗| 延津县| 永兴县| 凤翔县| 利川市| 刚察县| 忻城县| 城市| 三明市| 黄骅市| 磐石市| 当阳市| 鞍山市| 平定县| 淮安市| 汕尾市| 东乌珠穆沁旗| 伽师县| 玉龙| 张掖市| 宁强县| 比如县| 波密县| 泉州市| 漳平市| 张家口市| 安陆市| 玉环县| 宣武区| 招远市|