springboot整合RabbitMQ 中的 TTL實(shí)例代碼
TTL簡(jiǎn)介
TTL 是什么呢?TTL 是 RabbitMQ 中一個(gè)消息或者隊(duì)列的屬性,表明一條消息或者該隊(duì)列中的所有消息的最大存活時(shí)間,單位是毫秒。換句話說(shuō),如果一條消息設(shè)置了 TTL 屬性或者進(jìn)入了設(shè)置 TTL 屬性的隊(duì)列,那么這條消息如果在 TTL 設(shè)置的時(shí)間內(nèi)沒(méi)有被消費(fèi),則會(huì)成為"死信"。
下面就根據(jù)這個(gè)圖片來(lái)驗(yàn)證代碼
配置類代碼
這里寫(xiě)一些配置,比如創(chuàng)建隊(duì)列 交換機(jī) 和它們之間的綁定關(guān)系
- @Qualifier 注解與我們想要使用的特定 Spring bean 的名稱一起進(jìn)行裝配,Spring 框架就能從多個(gè)相同類型并滿足裝配要求的 bean 中找到我們想要的,避免讓Spring腦裂。我們需要做的是@Component或者@Bean注解中聲明的value屬性以確定名稱
注意 包別導(dǎo)錯(cuò)了
package com.xbfinal.springbootrabbitmq.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; /** * ttl隊(duì)列 配置文件類 * */ @Configuration public class TtlQueueConfig { //普通交換機(jī)名稱 public static final String X_EXCHANGE="X"; //死信交換機(jī)名稱 public static final String Y_DEAD_LETTER_EXCHANGE="Y"; //普通隊(duì)列名稱 public static final String QUEUE_A="QA"; public static final String QUEUE_B="QB"; //死信隊(duì)列名稱 public static final String DEAD_LETTER_QUEUE_D="QD"; /** * 聲明x交換機(jī) * @return */ @Bean("xExchange")//別名和方法名取一樣 public DirectExchange xExchange(){ return new DirectExchange(X_EXCHANGE); } /** * 聲明y交換機(jī) * @return */ @Bean("yExchange")//別名和方法名取一樣 public DirectExchange yExchange(){ return new DirectExchange(Y_DEAD_LETTER_EXCHANGE); } //聲明隊(duì)列A @Bean("queueA") public Queue queueA(){ final HashMap<String, Object> arguments = new HashMap<>(); //設(shè)置死信交換機(jī) arguments.put("x-dead-letter-exchange",Y_DEAD_LETTER_EXCHANGE); //設(shè)置死信RoutingKey arguments.put("x-dead-letter-routing-key","YD"); //設(shè)置TTL設(shè)置10秒過(guò)期 arguments.put("x-message-ttl",10000); return QueueBuilder.durable(QUEUE_A) .withArguments(arguments) .build(); } //聲明隊(duì)列B @Bean("queueB") public Queue queueB(){ HashMap<String, Object> arguments = new HashMap<>(); //設(shè)置死信交換機(jī) arguments.put("x-dead-letter-exchange",Y_DEAD_LETTER_EXCHANGE); //設(shè)置死信RoutingKey arguments.put("x-dead-letter-routing-key","YD"); //設(shè)置TTL設(shè)置40秒過(guò)期 arguments.put("x-message-ttl",40000); return QueueBuilder.durable(QUEUE_B) .withArguments(arguments) .build(); } @Bean("queueD") public Queue queueD(){ return QueueBuilder.durable(DEAD_LETTER_QUEUE_D) .build(); } /** * A隊(duì)列綁定X交換機(jī) * @param queueA * @return */ @Bean public Binding queueABindingX(@Qualifier("queueA")Queue queueA, @Qualifier("xExchange") DirectExchange xExchange){ return BindingBuilder.bind(queueA).to(xExchange).with("XA"); } /** * B隊(duì)列綁定X交換機(jī) * @param queueB * @param xExchange * @return */ @Bean public Binding queueBBindingX(@Qualifier("queueB")Queue queueB, @Qualifier("xExchange") DirectExchange xExchange){ return BindingBuilder.bind(queueB).to(xExchange).with("XB"); } /** * D隊(duì)列綁定死信y交換機(jī) * @param queueD * @param yExchange * @return */ @Bean public Binding queueDBindingX(@Qualifier("queueD")Queue queueD, @Qualifier("yExchange") DirectExchange yExchange){ return BindingBuilder.bind(queueD).to(yExchange).with("YD"); } }
生產(chǎn)者代碼
我們用
Controller
寫(xiě),通過(guò)網(wǎng)頁(yè)提交的方式 生產(chǎn)消息
url:http://localhost:8080/ttl/sendMsg/message
package com.xbfinal.springbootrabbitmq.controller; import lombok.extern.slf4j.Slf4j; 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; import java.util.Date; /** * 生產(chǎn)者 * 發(fā)送延遲消息 */ @Slf4j @RestController @RequestMapping("/ttl") public class SendMsgController { @Autowired private RabbitTemplate rabbitTemplate; @GetMapping("/sendMsg/{message}") public void sendMsg(@PathVariable String message){ log.info("當(dāng)前時(shí)間:{},發(fā)送了一條消息({})給兩個(gè)隊(duì)列", new Date().toString(),message); //發(fā)送消息 rabbitTemplate.convertAndSend("X","XA","10秒"+message); rabbitTemplate.convertAndSend("X","XB","40秒"+message); } }
消息消費(fèi)者代碼
注意@RabbitListener注解
@RabbitListener注解指定目標(biāo)方法來(lái)作為消費(fèi)消息的方法,通過(guò)注解參數(shù)指定所監(jiān)聽(tīng)的隊(duì)列或者Binding。使用@RabbitListener可以設(shè)置一個(gè)自己明確默認(rèn)值的RabbitListenerContainerFactory對(duì)象。
- @RabbitListener標(biāo)注在方法上,直接監(jiān)聽(tīng)指定的隊(duì)列,此時(shí)接收的參數(shù)需要與發(fā)送市類型一致
- 3.@RabbitListener 可以標(biāo)注在類上面,需配合 @RabbitHandler 注解一起使用
@RabbitListener 標(biāo)注在類上面表示當(dāng)有收到消息的時(shí)候,就交給 @RabbitHandler 的方法處理,根據(jù)接受的參數(shù)類型進(jìn)入具體的方法中。
package com.xbfinal.springbootrabbitmq.consumer; import com.rabbitmq.client.Channel; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; import java.util.Date; /** * 隊(duì)列TTL的消費(fèi)者 */ @Slf4j @Component public class DeadLetterQueueConsumer { //接收消息 @RabbitListener(queues = "QD") public void receivedD(Message message, Channel channel)throws Exception{ String msg=new String(message.getBody()); log.info("當(dāng)前時(shí)間:{},收到消息:{}",new Date().toString(),msg); } }
驗(yàn)證代碼
先在歷覽器輸入http://localhost:8080/ttl/sendMsg/%E7%AC%91%E9%9C%B8fianl
查看控制臺(tái):
到此這篇關(guān)于springboot整合RabbitMQ 中的 TTL的文章就介紹到這了,更多相關(guān)springboot整合RabbitMQ內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud+RocketMQ實(shí)現(xiàn)分布式事務(wù)的實(shí)踐
分布式事務(wù)已經(jīng)成為了我們的經(jīng)常使用的。所以我們來(lái)一步一步的實(shí)現(xiàn)基于RocketMQ的分布式事務(wù)。感興趣的可以了解一下2021-10-10SpringBoot整合MyBatis實(shí)現(xiàn)樂(lè)觀鎖和悲觀鎖的示例
這篇文章主要介紹了SpringBoot整合MyBatis實(shí)現(xiàn)樂(lè)觀鎖和悲觀鎖的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Spring Boot如何使用JDBC獲取相關(guān)的數(shù)據(jù)詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot如何使用JDBC獲取相關(guān)數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Java使用@Autowired注解獲取對(duì)象為null的幾種情況及解決方法
這篇文章主要給大家介紹了使用@Autowired注解獲取對(duì)象為null的幾種情況以及?解決方法,文中有詳細(xì)的代碼示例講解,具有一定的參考價(jià)值,需要的朋友可以參考下2023-09-09springboot2.0以上調(diào)度器配置線程池的實(shí)現(xiàn)
這篇文章主要介紹了springboot2.0以上調(diào)度器配置線程池的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12解決Java?properties文件里面如何寫(xiě)"\"的問(wèn)題
由于properties使用“\”相當(dāng)于是java的轉(zhuǎn)義符,如果想要寫(xiě)出\的效果,只需修改相應(yīng)的寫(xiě)法即可,對(duì)java?properties文件里的"\"寫(xiě)法感興趣的朋友一起看看吧2022-04-04springboot集成redis并使用redis生成全局唯一索引ID
本文主要介紹了springboot集成redis并使用redis生成全局唯一索引ID,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03