日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RabbitMQ的TTL+死信队列 看完这篇包会!!!

發(fā)布時間:2024/9/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RabbitMQ的TTL+死信队列 看完这篇包会!!! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這里寫目錄標(biāo)題

  • 一:TTL隊列過期時間設(shè)置
  • 二:TTL消息過期時間設(shè)置
  • 三:死信隊列

- 第一種是聲明隊列的時候,在隊列的屬性中設(shè)置,這樣該隊列中的消息都會有相同的有效期;
-第二種是發(fā)送消息時給消息設(shè)置屬性,可以為每條消息都設(shè)置不同的TTL。
如果兩種方式都設(shè)置了,則以設(shè)置的較小的為準(zhǔn)。

TTL是:Time To Live的縮寫 , 也就是生存時間
RabbitMQ支持消息的過期時間,在消息發(fā)送時可以進(jìn)行指定
RabbitMQ支持為每個隊列設(shè)置消息的超時時間,從消息入隊列開始計算只要超過了隊列的超時時間的配置,那么消息會自動的清除

一:TTL隊列過期時間設(shè)置

第一步配置好自己的yml

spring:rabbitmq:host: 192.168.192.168port: 5672virtual-host: /username: guestpassword: guest

創(chuàng)建生產(chǎn)者

@Component public class TtlProducer {@Autowiredprivate RabbitTemplate rabbitTemplate;public void makeTTL(String a,String b,int c){String Exchange = "TTLExchange";String TTL = "ttl";String message = UUID.randomUUID().toString();System.out.println("消息來了~~~~~"+message);//參數(shù)一:交換機(jī), 參數(shù)二:key, 參數(shù)三:消息rabbitTemplate.convertAndSend(Exchange,TTL,message);} }

創(chuàng)建消費(fèi)者

@Configuration public class TtlConsumer {@Bean//注冊一個direct模式的交換機(jī)public DirectExchange directExchange(){return new DirectExchange("TTLExchange",true,false);}@Beanpublic Queue aaa(){HashMap<String, Object> args = new HashMap<>();//我們可以給這個隊列設(shè)置一個時間args.put("x-message-ttl",5000);//表示5秒return new Queue("TTLQueue01.queue",true,false,false,args);}@Beanpublic Binding aaaBinding(){return BindingBuilder.bind(aaa()).to(directExchange()).with("ttl");} }

運(yùn)行

我們可以去web界面看

等5s后

二:TTL消息過期時間設(shè)置

發(fā)送消息時候給消息設(shè)置屬性
可以為每條消息設(shè)置不同的TTL

第一步配置好自己的yml

spring:rabbitmq:host: 192.168.192.168port: 5672virtual-host: /username: guestpassword: guest

創(chuàng)建生產(chǎn)者

@Component public class TTLProter {@Autowiredprivate RabbitTemplate rabbitTemplate;public void mekeMessage(String a,String b){String orderID = UUID.randomUUID().toString();System.out.println("消息~~~~"+orderID);String exchangeName ="ttl_direct_exchange";String luYouKey = "ttlmessage";MessagePostProcessor messagePostProcessor = new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {message.getMessageProperties().setExpiration("6000");message.getMessageProperties().setContentEncoding("UTF-8");return message;}};rabbitTemplate.convertAndSend(exchangeName,luYouKey,orderID,messagePostProcessor);} }

創(chuàng)建消費(fèi)者

@Configuration public class TTLConerter {@Beanpublic DirectExchange directExchange() {return new DirectExchange("ttl_direct_exchange", true, false);}@Beanpublic Queue abcQueue() {return new Queue("ttl.message.direct.queue",true,false,false);}@Beanpublic Binding abcBinding(){return BindingBuilder.bind(abcQueue()).to(directExchange()).with("ttlmessage");} }

測試

@SpringBootTest class SpringBootRabbitmqTtl2ApplicationTests {@Autowiredpublic TTLProter ttlProter;@Testvoid contextLoads() {ttlProter.mekeMessage("1","2");} }

三:死信隊列

DLX是:可以稱死信交換機(jī)。也可以稱死信郵箱
利用DLX,當(dāng)消息在一個隊列中變成死信 (dead message) 之后,它能被重新publish到另一個Exchange,這個Exchange就是DLX

消息變成死信有以下幾種情況

  • 消息被拒絕(basic.reject / basic.nack),并且requeue = false
  • 消息TTL過期
  • 隊列達(dá)到最大長度

死信處理過程

  • 當(dāng)消息在隊列中變成死信之后
    它能被重新發(fā)送到另外一個交換機(jī)中
    這個交換機(jī)就是DLX
    綁定DLX的隊列就成為死信隊列

個人總結(jié):死信隊列其實(shí)就是給過期的消息 創(chuàng)建一個交換機(jī)和隊列DLX
把那些銷毀的信息投入DLX

第一步配置好自己的yml

spring:rabbitmq:virtual-host: /host: 192.168.192.168port: 5672username: guestpassword: guest

創(chuàng)建生產(chǎn)者

@Component public class ttlProducer {@Autowiredprivate RabbitTemplate rabbitTemplate;public void makeTTL(String a, String b, int c) {String enchangeName = "ttlEnchange";String luyouKey = "ttl";String message = UUID.randomUUID().toString();System.out.println("消息消息消息!!!!"+message);rabbitTemplate.convertAndSend(enchangeName, luyouKey, message);} }

創(chuàng)建死信隊列
這個死信隊列專門存放過期的消息

@Configuration public class dlxBase {@Beanpublic DirectExchange DlxExchange(){return new DirectExchange("dead.dlx.Exchange",true,false);}@Beanpublic Queue bbbQueue(){return new Queue("bbb.Queue.dead");}@Beanpublic Binding bbbBinding(){return BindingBuilder.bind(bbbQueue()).to(DlxExchange()).with("dead");} }

創(chuàng)建隊列過期時間

@Configuration public class ttlConsumer {@Beanpublic DirectExchange directExchange(){return new DirectExchange("ttlEnchange",true,false);}@Beanpublic Queue aaaQueue(){HashMap<String, Object> args = new HashMap<>();args.put("x-message-ttl",5000);args.put("x-dead-letter-exchange","dead.dlx.Exchange");//綁定你創(chuàng)建的死信交換機(jī)args.put("x-dead-letter-routing-key","dead");//綁定你的死信交換機(jī)的keyreturn new Queue("aaa.Queue.ttl",true,false,false,args);}@Beanpublic Binding aaaBinding(){return BindingBuilder.bind(aaaQueue()).to(directExchange()).with("ttl");} }

測試:

@SpringBootTest class SpringBootRabbitmqSiApplicationTests {@Autowiredprivate ttlProducer ttlProducer;@Testvoid contextLoads() {ttlProducer.makeTTL("a","b",3);} }


我們可以去web界面看
消息隊列設(shè)置的是5秒過期時間
看看我們過期的消息是否進(jìn)入到死信隊列


學(xué)習(xí)是一步一步來的不要跳過
如果這里有很多代碼沒有看懂-可以去學(xué)學(xué)前面的知識RabbitMQ基礎(chǔ)大全

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的RabbitMQ的TTL+死信队列 看完这篇包会!!!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。