1 概述
RabbitMQ允許你為messages和queues設定TTL(存活時間)。這可以使用可選的queue 參數或政策來完成(建議使用後一個選項)。
Message TTL可以應用于單個隊列,一組隊列或逐個消息地應用。
TTL設定也可以由操作政策強制執行。
隊列中的 Per-Queue消息TTL
Message TTL可以通過使用政策設定message-ttl參數或通過在隊列聲明時指定相同的參數來為給定隊列設定.
已在隊列中的時間超過配置的TTL的消息被判定已死.
路由到多個隊列的消息可能會在其所在的每個隊列中的不同時間或根本不會消亡,一個隊列中的消息死亡對其他隊列中相同消息的生命沒有影響.
伺服器保證不會使用basic.deliver(發送給消費者)或者包含在basic.get-ok響應(對于一次性擷取操作)中來傳遞死消息.
此外,伺服器會嘗試在基于TTL的到期時或之後不久删除消息.
描述TTL周期(以毫秒為機關)的TTL參數或政策的值必須是非負整數.是以,值1000意味着添加到隊列的消息将在隊列中存活1秒或直到它被傳遞給消費者.參數可以是AMQP 0-9-1類型short-short-int,short-int,long-int或long-long-int.
3 使用政策為隊列定義消息TTL
要使用政策指定TTL,在Linux中,請将key “message-ttl”添加到政策定義中:

這對所有隊列應用60秒的TTL.
4 在聲明時使用 x-參數 為隊列定義消息的TTL
以下示例建立一個消息最多可駐留60秒的隊列:
可以将消息TTL政策應用于已經包含消息的隊列,但這涉及一些警告.
如果消息被重新排隊(例如,由于使用了具有重新排隊參數的AMQP方法,或者由于通道關閉),則保留消息的原始到期時間.
将TTL設定為0會導緻消息在到達隊列時過期,除非它們可以立即傳遞給消費者.
是以,這提供了立即釋出标志的替代方案,RabbitMQ伺服器不支援該标志.
與那個标志不同,沒有釋出basic.returns,如果設定了死信交換,那麼消息将被删除.
5 釋出者中的 Per-Message TTL
通過在發送basic.publish時設定基本的AMQP 0-9-1類中的expiration字段,可以在每個消息的基礎上指定TTL.
expiration字段的值描述TTL時間段(以毫秒為機關).适用與x-message-ttl相同的限制.
由于expiration字段必須是字元串,是以broker将(僅)接受該數字的字元串表示形式.
當指定了每個隊列和每個消息的TTL時,将選擇使用兩者之間的較小值.
以下示例使用RabbitMQ Java用戶端釋出一條消息,該消息可以駐留在隊列中最多60秒:
6 Caveats
具有針對每個消息TTL追溯應用的隊列(當他們已經有消息時)将在特定事件發生時丢棄消息.
隻有當過期的消息到達隊列的頭部時,它們才會被丢棄(或者被删除字母).消費者不會向他們發送過期消息.
消息到期和消費者傳遞之間可能存在自然競争條件,例如:郵件在寫入套接字之後但在到達使用者之前可能會過期。 設定每個消息的TTL過期消息可以在非過期消息之後排隊,直到後者消耗或過期。是以,這些過期消息使用的資源将不會被釋放,并且它們将被計入隊列統計中(例如隊列中的消息數)。 當追溯應用每消息TTL政策時,建議讓消費者聯機以確定更快地丢棄消息。 鑒于現有隊列上每個消息TTL設定的這種行為,當需要删除消息以釋放資源時,應該使用隊列TTL(或隊列清除或隊列删除)。 Queue TTL TTL也可以在隊列上設定,而不僅僅是隊列内容。隊列将在一段時間後過期,僅在不使用它們時(例如,沒有消費者)。此功能可與自動删除隊列屬性一起使用。通過将x-expires參數設定為queue.declare,或者通過設定expires政策,可以為給定隊列設定 Expiry time。這可以控制隊列在自動删除之前可以使用多長時間。未使用意味着隊列沒有消費者,隊列最近沒有重新聲明(重新聲明續訂租約),并且至少在有效期内沒有調用basic.get。例如,這可以用于RPC樣式的回複隊列,其中可以建立許多可能永遠不會被耗盡的隊列。 伺服器保證隊列将被删除,如果至少在有效期内未使用。不保證在到期期限過後如何及時删除隊列。伺服器重新啟動時,持久隊列的租約會重新啟動。 x-expires參數或expires政策的值描述了有效期(以毫秒為機關)。它必須是正整數(與消息TTL不同,它不能為0)。是以,值1000意味着将删除未使用1秒的隊列。 使用政策為隊列定義隊列TTL以下政策使所有隊列在上次使用後30分鐘後到期: rabbitmqctl rabbitmqctl set_policy expiry“。”’{“expires”:1800000}’ - apply-to queues rabbitmqctl(Windows) rabbitmqctl.bat set_policy expiry“。”“{”“expires”“:1800000}” - apply-to queues 在聲明期間使用x參數為隊列定義隊列TTL Java中的這個例子建立一個隊列,該隊列在未使用30分鐘後到期。 Map String,Object args = new HashMap String,Object(); args.put(“x-expires”,1800000); channel.queueDeclare(“myqueue”,false,false,false,args); 擷取幫助和提供回報如果您對本指南的内容或與RabbitMQ相關的任何其他主題有疑問,請不要猶豫,在RabbitMQ郵件清單中詢問他們。 幫助我們改進文檔3 如果您想對網站做出改進,可以在GitHub上找到它的來源。隻需分叉存儲庫并送出拉取請求。謝謝! 本節内容伺服器文檔用戶端文檔插件新聞協定我們的擴充确認消費者取消消費者預取消費者優先級直接回複被阻止的連接配接basic.nack e2e綁定備用交換發件人路由TTL死字母長度限制優先級隊列驗證使用者ID驗證失敗規格差異建構以前的版本許可證