RabbitMQ的TTL+死信队列 看完这篇包会!!!
生活随笔
收集整理的這篇文章主要介紹了
RabbitMQ的TTL+死信队列 看完这篇包会!!!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這里寫目錄標題
- 一:TTL隊列過期時間設置
- 二:TTL消息過期時間設置
- 三:死信隊列
- 第一種是聲明隊列的時候,在隊列的屬性中設置,這樣該隊列中的消息都會有相同的有效期;
-第二種是發送消息時給消息設置屬性,可以為每條消息都設置不同的TTL。
如果兩種方式都設置了,則以設置的較小的為準。
TTL是:Time To Live的縮寫 , 也就是生存時間
RabbitMQ支持消息的過期時間,在消息發送時可以進行指定
RabbitMQ支持為每個隊列設置消息的超時時間,從消息入隊列開始計算只要超過了隊列的超時時間的配置,那么消息會自動的清除
一:TTL隊列過期時間設置
第一步配置好自己的yml
spring:rabbitmq:host: 192.168.192.168port: 5672virtual-host: /username: guestpassword: guest創建生產者
@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);//參數一:交換機, 參數二:key, 參數三:消息rabbitTemplate.convertAndSend(Exchange,TTL,message);} }創建消費者
@Configuration public class TtlConsumer {@Bean//注冊一個direct模式的交換機public DirectExchange directExchange(){return new DirectExchange("TTLExchange",true,false);}@Beanpublic Queue aaa(){HashMap<String, Object> args = new HashMap<>();//我們可以給這個隊列設置一個時間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");} }運行
我們可以去web界面看
等5s后
二:TTL消息過期時間設置
發送消息時候給消息設置屬性
可以為每條消息設置不同的TTL
第一步配置好自己的yml
spring:rabbitmq:host: 192.168.192.168port: 5672virtual-host: /username: guestpassword: guest創建生產者
@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);} }創建消費者
@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是:可以稱死信交換機。也可以稱死信郵箱
利用DLX,當消息在一個隊列中變成死信 (dead message) 之后,它能被重新publish到另一個Exchange,這個Exchange就是DLX
消息變成死信有以下幾種情況
- 消息被拒絕(basic.reject / basic.nack),并且requeue = false
- 消息TTL過期
- 隊列達到最大長度
死信處理過程
- 當消息在隊列中變成死信之后
它能被重新發送到另外一個交換機中
這個交換機就是DLX
綁定DLX的隊列就成為死信隊列
個人總結:死信隊列其實就是給過期的消息 創建一個交換機和隊列DLX
把那些銷毀的信息投入DLX
第一步配置好自己的yml
spring:rabbitmq:virtual-host: /host: 192.168.192.168port: 5672username: guestpassword: guest創建生產者
@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);} }創建死信隊列
這個死信隊列專門存放過期的消息
創建隊列過期時間
@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");//綁定你創建的死信交換機args.put("x-dead-letter-routing-key","dead");//綁定你的死信交換機的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界面看
消息隊列設置的是5秒過期時間
看看我們過期的消息是否進入到死信隊列
學習是一步一步來的不要跳過
如果這里有很多代碼沒有看懂-可以去學學前面的知識RabbitMQ基礎大全
總結
以上是生活随笔為你收集整理的RabbitMQ的TTL+死信队列 看完这篇包会!!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Springboot整合RabbitMq
- 下一篇: rabbitmq延迟队列实现