TTL佇列訊息與死信佇列

2021-09-13 17:28:18 字數 2714 閱讀 9942

ttl是time to live的縮寫,生存時間

rabbitmq支援訊息的過期時間,訊息傳送時可以指定,從訊息入佇列開始計算,只要超過佇列的超時時間配置,訊息就會自動清除

mapargs = new hashmap();

args.put("x-message-ttl", 60000);

channel.queuedeclare("myqueue", false, false, false, args);

public class consumer 

}}

ttl 設定可以具體到每一條 message 本身,只要在通過 basic.publish 命令傳送 message 時設定 expiration 字段

示例 publish 了最多能在 queue 中存活 60 秒的 message : 

byte messagebodybytes = "hello, world!".getbytes();

amqp.basicproperties properties = new amqp.basicproperties();

properties.setexpiration("60000");

channel.basicpublish("myexchange", "routingkey", properties, messagebodybytes);

public class procuder 

//5 記得要關閉相關的連線

channel.close();

connection.close();

system.out.println("success");

}}

當同時指定了 queue和 message的 ttl值,則兩者中較小的那個才會起作用。

當訊息在乙個佇列中變成死信(訊息沒有任何消費者去消費)之後,它能被重新publish到另乙個exchange,這個exchange就是dlx

dlx也是乙個正常的exchange,和一般的exchange沒什麼區別,它能在任何的佇列上被指定,實際就是設定某個佇列的屬性

當這個佇列中有死信時,rabbitmq就會自動將這個訊息重新發布到設定的exchange上去,進而路由到另乙個佇列

訊息被拒絕(basic.rejec/basic.nack)且requeue=false

channel.basicnack(envelope.getdeliverytag(), false, false)

ttl過期

佇列超時設定或訊息的超時設定

佇列達到最長長度

設定死信佇列的exchange和queue,然後進行繫結

exchange:dlx.exchange

queue:dxs.queue

routingkey:#

正常宣告交換機、佇列、繫結,只不過我們需要在佇列加上乙個引數:arguments.put(「x-dead-letter-exchange」,」 dlx.exchange」);

amqp.basicproperties properties = new amqp.basicproperties.builder()

.deliverymode(2)

.contentencoding("utf-8")

.expiration("10000")

.build();

channel.basicpublish(exchange, routingkey,   properties, msg.getbytes());

public class producer 

}}

channel.exchangedeclare(exchangename, "topic", true, false, null);

mapagruments = new hashmap();

agruments.put("x-dead-letter-exchange", "dlx.exchange");

//這個agruments屬性,要設定到宣告佇列上

channel.queuedeclare(queuename, true, false, false, agruments);

channel.queuebind(queuename, exchangename, routingkey);

//要進行死信佇列的宣告:

channel.exchangedeclare("dlx.exchange", "topic", true, false, null);

channel.queuedeclare("dlx.queue", true, false, false, null);

channel.queuebind("dlx.queue", "dlx.exchange", "#");

//#channel.basicconsume(queuename, true, new myconsumer(channel));

public class consumer 

}

過期時間TTL與死信佇列

過期時間ttl表示可以對訊息設定預期的時間,在這個時間內都可以被消費者接收獲取 過了之後訊息將自動被刪除。rabbitmq可以對訊息和佇列設定ttl。目前有兩種方法可以設定。如果上述兩種方法同時使用,則訊息的過期時間以兩者之間ttl較小的那個數值為準。訊息在佇列的生存時間一旦超過設 置的ttl值,就...

RabbitMq死信佇列

死信交換機有什麼用呢?在建立佇列的時候 可以給這個佇列附帶乙個交換機,那麼這個佇列作廢的訊息就會被重新發到附帶的交換機,然後讓這個交換機重新路由這條訊息。通俗的說,就是訊息產生之後,因為設定了超時時間,在這段時間內訊息沒有被消費就會被扔到死信佇列裡面。交換機名稱 private static fin...

rabbitmq死信佇列

死信佇列 dlx dead letter exchange 利用dlx,當訊息在乙個佇列中變成死信 dead message 之後,它能重新publish到另外乙個exchange,這個exchange就是dxl 訊息變成死信的幾種情況 訊息被拒絕 basic.reject basic.nack 並...