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

Springboot整合RabbitMq測(cè)試TTL的方法詳解

 更新時(shí)間:2022年03月01日 10:01:02   作者:專注寫bug  
這篇文章主要介紹了Springboot整合RabbitMq測(cè)試TTL的設(shè)置,設(shè)置TTL一般由兩種設(shè)置方法,設(shè)置整個(gè)隊(duì)列的過(guò)期時(shí)間另一種設(shè)置單個(gè)消息的過(guò)期時(shí)間,通過(guò)示例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下

什么是TTL?

RabbitMq中,存在一種高級(jí)特性 TTL。

TTLTime To Live的縮寫,含義為存活時(shí)間或者過(guò)期時(shí)間。即:

設(shè)定消息在隊(duì)列中存活的時(shí)間。
當(dāng)指定時(shí)間內(nèi),消息依舊未被消費(fèi),則由隊(duì)列自動(dòng)將其刪除。

如何設(shè)置TTL?

既然涉及到設(shè)定消息的存活時(shí)間,在RabbitMq中,存在兩種設(shè)置方式:

  • 設(shè)置整個(gè)隊(duì)列的過(guò)期時(shí)間。
  • 設(shè)置單個(gè)消息的過(guò)期時(shí)間。

在這里插入圖片描述

設(shè)定整個(gè)隊(duì)列的過(guò)期時(shí)間

按照上一篇文章的依賴導(dǎo)入和配置編寫方式進(jìn)行。

Springboot——整合Rabbitmq之Confirm和Return詳解

配置類編寫

在原有基礎(chǔ)之上,新創(chuàng)建幾個(gè)配置的bean類,申明bean對(duì)象,并進(jìn)行交換機(jī)隊(duì)列的關(guān)聯(lián),如下所示:、

package cn.linkpower.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class MQConfiguration {
	// ===========================  Direct 直連模式  ==================================
	//隊(duì)列名稱
	public static final String QUEUQ_NAME = "xiangjiao.queue";
	//交換器名稱
	public static final String EXCHANGE = "xiangjiao.exchange";
	//路由key
	public static final String ROUTING_KEY = "xiangjiao.routingKey";
	// =========================== Direct 普通隊(duì)列申明 和 交換機(jī)綁定  ===================
	//創(chuàng)建隊(duì)列
	@Bean(value = "getQueue")
	public Queue getQueue(){
		//QueueBuilder.durable(QUEUQ_NAME).build();
		return new Queue(QUEUQ_NAME);
	}
	//實(shí)例化交換機(jī)
	@Bean(value = "getDirectExchange")
	public DirectExchange getDirectExchange(){
		//DirectExchange(String name, boolean durable, boolean autoDelete)
		/**
		 * 參數(shù)一:交換機(jī)名稱;<br>
		 * 參數(shù)二:是否永久;<br>
		 * 參數(shù)三:是否自動(dòng)刪除;<br>
		 */
		//ExchangeBuilder.directExchange(EXCHANGE).durable(true).build();
		return new DirectExchange(EXCHANGE, true, false);
	//綁定消息隊(duì)列和交換機(jī)
	@Bean
	public Binding bindExchangeAndQueue(@Qualifier(value = "getDirectExchange")  DirectExchange exchange,
										@Qualifier(value = "getQueue") Queue queue){
		return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
	// ===========================  TTL ================================
	public static final String ttl_queue_name = "xiangjiao.ttl.queue";
	public static final String ttl_exchange_name = "xiangjiao.ttl.exchange";
	public static final String ttl_routing_key = "xiangjiao.ttl.routingKey";
	@Bean(value = "getTtlQueue")
	public Queue getTtlQueue(){
		// 設(shè)置 ttl 隊(duì)列,并設(shè)定 x-message-ttl 參數(shù),表示 消息存活最大時(shí)間,單位  ms
		//return QueueBuilder.durable(ttl_queue_name).withArgument("x-message-ttl",10000).build();
		Map<String, Object> arguments = new HashMap<>();
		arguments.put("x-message-ttl",10000);
		return new Queue(ttl_queue_name,true,false,false,arguments);
	@Bean(value = "getTTlExchange")
	public DirectExchange getTTlExchange(){
		// 設(shè)置交換機(jī)屬性,并保證交換機(jī)持久化
		return new DirectExchange(ttl_exchange_name, true, false);
	public Binding bindExchangeAndQueueTTL(@Qualifier(value = "getTTlExchange")  DirectExchange getTTlExchange,
										   @Qualifier(value = "getTtlQueue") Queue queue){
		return BindingBuilder.bind(queue).to(getTTlExchange).with(ttl_routing_key);
}

對(duì)比原有的配置類,不難發(fā)現(xiàn)區(qū)別:

對(duì)隊(duì)列設(shè)置過(guò)期屬性,只需要傳遞一個(gè) x-message-ttl 的屬性值即可。(單位:ms)

Map<String, Object> arguments = new HashMap<>();
arguments.put("x-message-ttl",10000);
return new Queue(ttl_queue_name,true,false,false,arguments);

然后定義交換機(jī)類型,并將指定的交換機(jī)和隊(duì)列進(jìn)行綁定。

為了測(cè)試效果,暫未定義任何該隊(duì)列的消費(fèi)者信息。

測(cè)試

為了便于測(cè)試,需要定義一個(gè)接口,生產(chǎn)新的數(shù)據(jù)信息,并將數(shù)據(jù)向?qū)?yīng)的Exchange中傳遞。

/**
 * 發(fā)送消息,指定ttl參數(shù)信息(隊(duì)列)
 * @return
 */
@RequestMapping("/sendQueueTtl")
@ResponseBody
public String sendQueueTtl(){
	//發(fā)送10條消息
	for (int i = 0; i < 10; i++) {
		String msg = "msg"+i;
		System.out.println("發(fā)送消息  msg:"+msg);
		rabbitmqService.sendMessage(MQConfiguration.ttl_exchange_name,MQConfiguration.ttl_routing_key,msg);
		//每?jī)擅氚l(fā)送一次
		try {
			Thread.sleep(8000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	return "send ok";
}

兩條消息之間的過(guò)期時(shí)間為8s

請(qǐng)求鏈接進(jìn)行測(cè)試,查看Rabbitmq web視圖信息:

http://localhost/sendQueueTtl

在這里插入圖片描述

在這里插入圖片描述

查看控制臺(tái)輸出日志:

在這里插入圖片描述

消息正常發(fā)送到了Exchange,同時(shí)Exchange 也將消息推送到了指定的隊(duì)列 !

設(shè)置有ConfirmReturn監(jiān)聽。

【說(shuō)明:】

給隊(duì)列設(shè)定時(shí)間后,單位時(shí)間內(nèi)的消息如果未被消費(fèi),則隊(duì)列會(huì)將其中的數(shù)據(jù)進(jìn)行刪除處理。

對(duì)單個(gè)消息設(shè)定過(guò)期時(shí)間

上面的操作和測(cè)試,已經(jīng)驗(yàn)證對(duì)隊(duì)列設(shè)定過(guò)期時(shí)間,會(huì)導(dǎo)致所有的消息過(guò)期時(shí)間都是一樣的現(xiàn)象。

但實(shí)際開發(fā)中,可能一個(gè)隊(duì)列需要存放不同過(guò)期時(shí)間的消息信息,如果需要進(jìn)行實(shí)現(xiàn),就不能再設(shè)定隊(duì)列的過(guò)期時(shí)間信息了,需要采取下面要說(shuō)到的針對(duì)單個(gè)消息,設(shè)置不同過(guò)期時(shí)間。

配置

既然是針對(duì)單個(gè)消息設(shè)定不同的過(guò)期時(shí)間操作,則需要去掉隊(duì)列過(guò)期設(shè)置。

為了測(cè)試的簡(jiǎn)單化,此處采取直連 Direct 交換機(jī)類型,進(jìn)行交換機(jī)和隊(duì)列數(shù)據(jù)的綁定方式。如下所示:

// ===========================  Direct 直連模式  ==================================
//隊(duì)列名稱
public static final String QUEUQ_NAME = "xiangjiao.queue";
//交換器名稱
public static final String EXCHANGE = "xiangjiao.exchange";
//路由key
public static final String ROUTING_KEY = "xiangjiao.routingKey";

// =========================== Direct 普通隊(duì)列申明 和 交換機(jī)綁定  ===================
//創(chuàng)建隊(duì)列
@Bean(value = "getQueue")
public Queue getQueue(){
	//QueueBuilder.durable(QUEUQ_NAME).build();
	return new Queue(QUEUQ_NAME);
}
//實(shí)例化交換機(jī)
@Bean(value = "getDirectExchange")
public DirectExchange getDirectExchange(){
	//DirectExchange(String name, boolean durable, boolean autoDelete)
	/**
	 * 參數(shù)一:交換機(jī)名稱;<br>
	 * 參數(shù)二:是否永久;<br>
	 * 參數(shù)三:是否自動(dòng)刪除;<br>
	 */
	//ExchangeBuilder.directExchange(EXCHANGE).durable(true).build();
	return new DirectExchange(EXCHANGE, true, false);
}
//綁定消息隊(duì)列和交換機(jī)
@Bean
public Binding bindExchangeAndQueue(@Qualifier(value = "getDirectExchange")  DirectExchange exchange,
									@Qualifier(value = "getQueue") Queue queue){

	return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
}

對(duì)于消息的發(fā)送,依舊沿用之前寫的發(fā)送處理方式

設(shè)定confirmreturn監(jiān)聽,保證消息能夠正常到達(dá)指定的隊(duì)列中。

測(cè)試

編寫一個(gè)測(cè)試的接口,設(shè)定單個(gè)消息的過(guò)期時(shí)間屬性,保證不同消息具備不同的過(guò)期時(shí)間

在之前博客中,針對(duì)消息的持久化設(shè)置,需要保證消息向隊(duì)列設(shè)定屬性時(shí),傳遞一個(gè)deliveryMode參數(shù)值信息。

同理,設(shè)定每個(gè)消息的過(guò)期時(shí)間,也需要設(shè)定對(duì)應(yīng)的屬性信息。如下所示:

/**
 * 發(fā)送消息,指定ttl參數(shù)信息(單個(gè)消息);
 * 測(cè)試需要將消息消費(fèi)者關(guān)閉監(jiān)聽
 * @return
 */
@RequestMapping("/sendTtl")
@ResponseBody
public String sendTtl(){
	//發(fā)送10條消息
	for (int i = 0; i < 10; i++) {
		String msg = "msg"+i;
		System.out.println("發(fā)送消息  msg:"+msg);
		
		MessageProperties messageProperties = new MessageProperties();
		messageProperties.setExpiration("5000"); // 針對(duì)消息設(shè)定時(shí)限
		// 將消息數(shù)據(jù)和設(shè)置屬性進(jìn)行封裝,采取消息發(fā)送模板,將消息數(shù)據(jù)推送至指定的交換機(jī) exchange 中
		Message message = new Message(msg.getBytes(), messageProperties);
		
		rabbitmqService.sendMessage(MQConfiguration.EXCHANGE, MQConfiguration.ROUTING_KEY,message);
		//每?jī)擅氚l(fā)送一次
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	return "send ok";
}

上面代碼的編寫核心為將消息內(nèi)容體和消息對(duì)象屬性進(jìn)行封裝。

MessageProperties messageProperties = new MessageProperties();
messageProperties.setExpiration("5000"); // 針對(duì)消息設(shè)定時(shí)限
// 將消息數(shù)據(jù)和設(shè)置屬性進(jìn)行封裝,采取消息發(fā)送模板,將消息數(shù)據(jù)推送至指定的交換機(jī) exchange 中
Message message = new Message(msg.getBytes(), messageProperties);

引申一點(diǎn):消息的持久化
Springboot 2.x ——RabbitTemplate為什么會(huì)默認(rèn)消息持久化?

請(qǐng)求連接進(jìn)行測(cè)試:

http://localhost/sendTtl

在這里插入圖片描述

查看控制臺(tái)打印日志情況:

在這里插入圖片描述

總結(jié)

1、設(shè)置隊(duì)列過(guò)期時(shí)間使用參數(shù):x-message-ttl,單位:ms(毫秒),會(huì)對(duì)整個(gè)隊(duì)列消息統(tǒng)一過(guò)期。

2、設(shè)置消息過(guò)期時(shí)間使用參數(shù):expiration。單位:ms(毫秒),當(dāng)該消息在隊(duì)列頭部時(shí)(消費(fèi)時(shí)),會(huì)單獨(dú)判斷這一消息是否過(guò)期。

3、如果兩者都進(jìn)行了設(shè)置,以時(shí)間短的為準(zhǔn)。

代碼下載

gitee 代碼下載

到此這篇關(guān)于Springboot整合RabbitMq測(cè)試TTL的文章就介紹到這了,更多相關(guān)Springboot整合RabbitMq內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

汉川市| 晋州市| 江油市| 任丘市| 鲁山县| 斗六市| 鄂伦春自治旗| 辛集市| 漾濞| 进贤县| 桃园市| 潢川县| 津南区| 孙吴县| 江永县| 抚宁县| 固始县| 于都县| 东港市| 都兰县| 漳浦县| 鹤山市| 孝义市| 同心县| 黄山市| 莲花县| 简阳市| 西贡区| 杨浦区| 德庆县| 安仁县| 犍为县| 宣恩县| 钦州市| 宜都市| 调兵山市| 龙州县| 丹巴县| 麟游县| 米易县| 吉林市|