第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開發(fā)者教程

RabbitMQ 入門教程

RabbitMQ 簡介
RabbitMQ 簡介

RabbitMQ 中TTL消息介紹

1. 前言

Hello,大家好。本小節(jié)會為同學(xué)們介紹 RabbitMQ 中自帶的另一種機制,就是 TTL 消息,以及 TTL 消息隊列。TTL 消息和 TTL 消息隊列是我們實際工作中使用頻率較高的一種機制,這種機制規(guī)定了在特定條件下,消息的有效時間,通過應(yīng)用這種機制,我們可以很靈活地對消息進(jìn)行控制。

TTL 消息以及 TTL 消息隊列這種機制,一般不會單獨使用,在實際工作中都會搭配死信隊列一并使用,那么在本節(jié)中,會首先為同學(xué)們介紹何為 TTL 消息以及 TTL 消息隊列,在下一節(jié)就會為同學(xué)們介紹什么是死信隊列了。

話不多說,就讓我們先來了解一下什么是 TTL 消息吧。

本節(jié)主要內(nèi)容:

  • TTL 消息概述;

2. TTL 消息概述

基礎(chǔ)概念:

TTL,全稱為 Time to Live ,即生存時間。 說到這個 TTL ,想必大家都有所接觸,這個 TTL 并不是 RabbitMQ 中獨有的特性,我們在進(jìn)行應(yīng)用程序開發(fā)時,我們使用的其他工具中,也具備這個生存時間的概念,只不過描述的可能不一樣,但是含義相同。那么在 RabbitMQ 中,TTL 描述的又是什么呢?

在 RabbitMQ 中,TTL 這一概念是作用于消息和消息隊列上,即為消息以及消息隊列規(guī)定了一個生存時間,當(dāng)消息或消息隊列的生存時間超過了 TTL 所規(guī)定的生存時間之后,消息就會失效,且不會被消費。

其中,對于消息來說,一旦消息的生存時間超過了 TTL 所規(guī)定的消息生存時間,那么,這條消息會立即失效,并且不會被任何消費者消費,且會變成一種死信,并最終會被 RabbitMQ 放入死信隊列中(相關(guān)概念下節(jié)介紹,下同)。

而對于消息隊列來說,如果消息隊列的生存時間超過了 TTL 所規(guī)定的消息隊列的生存時間,那么消息隊列會立即失效,且該消息隊列中的消息也會隨著消息隊列的失效而失效。 這就提醒我們,在對應(yīng)用程序中的消息進(jìn)行操作時,可以根據(jù)業(yè)務(wù)需要來設(shè)置專門一條消息的生存時間,也可以設(shè)置同一消息類型的消息隊列的生存時間,以靈活控制消息的有效期限。

從消費者的角度來說,我們也可以這樣理解:在消息被設(shè)置了 TTL 之后,如果這個消息的等待時間超過了 TTL ,則這個消息就不會被任何消費者消費;從生產(chǎn)者的角度來說,生產(chǎn)者發(fā)送了一條消息到 RabbitMQ Server 中,且已經(jīng)設(shè)置了 TTL ,如果這個消息的等待時間超過了 TTL ,即使有消費者來接收消息,這個消息也不會被接收,同時,生產(chǎn)者也不會再次發(fā)送相同的消息。

在了解了 TTL 的基礎(chǔ)概念之后,我們還需要了解如何通過代碼,來配置 TTL 消息。

代碼實現(xiàn):

配置 TTL ,需要我們在生產(chǎn)端進(jìn)行配置,代碼如下:

ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("xx");
connectionFactory.setPort("5672");
connectionFactory.setVirtualHost("/");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChanel();
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
        .deliveryMode(2)
        .expiration("10000")
        .contentEncoding("UTF-8")
        .build();
channel.basicPublish(exchangeName, routingKey, true, properties, msg.getBytes());

代碼解釋:

第 1-5 行,我們使用 ConnectionFactory 創(chuàng)建了一個客戶端連接 RabbitMQ Server 的連接。

第 6 行,我們使用建立好的連接,來創(chuàng)建了一個頻道 channel 。

第 7-12 行,我們使用 AMQP.BasicProperties 來初始化了一個具體消息的 properties 參數(shù),初始化 properties 的過程采用了 AMQP 的調(diào)用鏈模式,即通過 AMQP.BasicProperties.Builder() 來對 properties 進(jìn)行初始化。

其中,deliveryMode 表示 properties 的投遞模式,2 表示持久化投遞,即 RabbitMQ Server 重啟之后依然有效;contentEncoding 表示 properties 的編碼模式,這里是支持中文的 UTF-8 格式;expiration 屬性就是來對當(dāng)前的消息設(shè)置生存時間的屬性,其單位為毫秒,這里設(shè)置的 TTL 為 10 秒, 當(dāng)我們對 properties 的屬性設(shè)置完畢后,調(diào)用 build 方法即可完成 properties 的構(gòu)建。

第 13 行,我們使用 channel 的 basicPublish 方法,將消息發(fā)送到 RabbitMQ Server 中,這里我們直接來看 basicPublish 方法的第四個參數(shù),其他參數(shù)已經(jīng)介紹很多次了,這里不再介紹。

我們都知道,在 RabbitMQ 中,一條具體的消息被分為了消息體和消息參數(shù)兩個部分, 其中,消息體指的是我們應(yīng)用程序中的數(shù)據(jù),消息參數(shù)指的是針對這一應(yīng)用程序中的數(shù)據(jù)進(jìn)行配置的一系列參數(shù),常見的參數(shù)有字符集、請求頭、投遞方式等。basicPublish 方法的第三個參數(shù)指的就是一條消息的消息參數(shù),即我們通過調(diào)用鏈模式來構(gòu)造出的 properties 參數(shù)。

將我們構(gòu)造好的 properties 參數(shù)一同發(fā)送到 RabbitMQ Server 中,那么,我們配置的 properties 的屬性就會生效,即該條消息的 TTL 為 10 秒。

上述代碼是配置 TTL 消息的,那么 TTL 消息隊列又該如何配置呢,我們看以下代碼:

代碼實現(xiàn):

// 省略客戶端連接 RabbitMQ Server 代碼
Map<String, Object> queueArgumentMap = new HashMap<>();
queueArgumentMap.put("x-message-ttl", "10000");
channel.queueDeclare(queueName, true, true, false, queueArgumentMap);

代碼解釋:

第 2-3 行,我們聲明了一個名為 queueArgumentMap 的 HashMap ,并且指定 key 為 x-message-ttl ,value 為 10000 ,且都是字符串類型。

第 4 行,我們使用 channel 的 queueDeclare 方法,來聲明一個隊列,這里我們重點看 queueDeclare 方法的第五個參數(shù),這個參數(shù)是一個 Map 類型的 arguments 參數(shù),是專門來對隊列進(jìn)行額外配置的參數(shù), 其值就是我們聲明的這個 queueArgumentMap 。

在 queueArgumentMap 中,key 為 RabbitMQ 官方規(guī)定的設(shè)置 TTL 的 key 值,value 即為我們要設(shè)置的 TTL 的具體時間,單位為毫秒,這里同樣設(shè)置為了 10 秒。

Tips: 1.在實際工作中,給消息或者消息隊列設(shè)置 TTL 是很常見的,所以需要同學(xué)們完全掌握本節(jié)內(nèi)容,這樣才能在工作中運用自如;
2. queueArgumentMap 中 key 的指定必須要按照 RabbitMQ 官方給出的 key 值來聲明,不能自定義聲明,否則,將不會起到任何作用;
3. 在為消息或消息隊列設(shè)置了 TTL 之后,如果我們想要看到直觀地結(jié)果,我們可以自行編寫一個測試程序,并結(jié)合 RabbitMQ 的消息管控臺來觀察,這樣效果會很明顯。

3. 小結(jié)

本小節(jié)為同學(xué)們介紹了 RabbitMQ 中,如何為消息以及消息隊列設(shè)置 TTL 生存時間。從 TTL 的基礎(chǔ)概念開始,到 TTL 消息以及 TTL 消息隊列的編碼實現(xiàn)結(jié)束,詳細(xì)介紹了 TTL 是什么、TTL 的作用,以及不同組件下如何配置 TTL ,TTL 在實際工作中應(yīng)用較多,希望同學(xué)們可以完全掌握通過代碼的方式來對消息和消息隊列配置 TTL ,這樣我們才能對消息更加靈活地進(jìn)行配置。