前言: 在RabbitMQ中,如果在聲明隊列時不指定TTL(Time-To-Live,存活時間),但在發(fā)布消息時指定了TTL,則會使用消息的TTL。當(dāng)消息過期時,它不會自動進(jìn)入死信(Dead Letter)隊列,除非你專門設(shè)置了死信交換器(Dead Letter Exchange,DLX)。 為了讓過期的消息進(jìn)入死信隊列,你需要做以下幾步: 聲明一個死信交換機(jī)(my-dlx) 聲明一個死信隊列(dead-queue),并在聲明完成后,綁定死信交換機(jī)(my-dlx)和死信routing-key(比如我定義叫dlx.ttl.key) 聲明一個普通隊列(normal-queue),聲明時要指定兩個參數(shù) x-dead-letter-exchange:指定你剛剛聲明的死信交換機(jī)(my-dlx) x-dead-letter-routing-key:指定你剛剛自定義的routing-key(dlx.ttl.key) 發(fā)送消息的時候,設(shè)置消息的TTL。 看圖說話 1. 聲明一個死信交換機(jī),如下圖 2. 聲明一個死信隊列,如下圖 3. 聲明一個普通隊列,并設(shè)置參數(shù)(x-dead-letter-exchange,x-dead-letter-routing-key),如下圖 4. 為死信隊列綁定綁定死信交換機(jī)(mgcc-dlx)和死信routing-key(比如我定義叫dlx.ttl.key) 貼一段發(fā)消息的代碼 /** * 發(fā)送帶TTL的數(shù)據(jù)至優(yōu)先級隊列 * * @param routingKey 隊列名稱 * @param message 消息 * @param priority 優(yōu)先級 1-10 */ public void mgccSendTtlPriorityQueue(String routingKey, Object message, int priority, String expiration) { log.info("發(fā)送消息【{}】至優(yōu)先級隊列【{}】,優(yōu)先級為:{},有效期為:{}", message, routingKey, priority, expiration); mgccRabbitTemplate.convertAndSend(routingKey, message, messageProperties -> { messageProperties.getMessageProperties().setPriority(priority); messageProperties.getMessageProperties().setExpiration(expiration); return messageProperties; }); } @Test public void test() { Long millisecondDiff = 5000L; producerService.mgccSendTtlPriorityQueue("mgcc_test", "asd", 1, millisecondDiff.toString()); } 看看效果 1. 向普通隊列(mgcc_test)發(fā)消息,消息正常進(jìn)入,顯示待消費(fèi)數(shù)量:1 2. 普通隊列(mgcc_test)消息過期后,消息流入死信隊列(test_dead),顯示待消費(fèi)數(shù)量:1 大功告成! |
|
來自: 修行的嘟嘟 > 《軟件開發(fā)》