RabbitMQ知識點整理7-queueDeclare方法詳解


queueDeclare方法相對於exchangeDeclare方法而言, 重載的方法個數就少很多, 只有兩個重載方法

1.Queue.DeclareOk queueDeclare() throws IOException;
2.Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
                                 Map<String, Object> arguments) throws IOException;

不帶任何參數的queueDeclare 方法默認創建一個由RabbitMQ 命名的(類似這種amq.gen-LhQzlgv3GhDOv8PIDabOXA 名稱,這種隊列也稱之為匿名隊列)、排他的、自動刪除的、非持久化的隊列。

方法的參數詳細說明如下:

queue: 隊列的名稱

durable: 設置是否持久化, true表示隊列為持久化, 持久化的隊列會存盤, 在服務器重啟的時候會保證不丟失相關信息

exclusive: 設置是否排他, true表示隊列為排他的, 如果一個隊列被設置為排他隊列, 該隊列僅對首次聲明它的連接可見, 並在連接斷開時自動刪除, (這里需要注意三點:1.排他隊列是基於連接Connection可見的, 同一個連接的不同信道Channel是可以同時訪問同一連接創建的排他隊列;"首次"是指如果一個連接己經聲明了一個排他隊列,其他連接是不允許建立同名的排他隊列的,這個與普通隊列不同;即使該隊列是持久化的,一旦連接關閉或者客戶端退出,該排他隊列都會被自動刪除,這種隊列適用於一個客戶端同時發送和讀取消息的應用場景)

autoDelete: 設置是否自動刪除。為true 則設置隊列為自動刪除。自動刪除的前提是, 至少有一個消費者連接到這個隊列,之后所有與這個隊列連接的消費者都斷開時,才會自動刪除。不能把這個參數錯誤地理解為: "當連接到此隊列的所有客戶端斷開時,這個隊列自動刪除",因為生產者客戶端創建這個隊列,或者沒有消費者客戶端與這個隊列連接時,都不會自動刪除這個隊列。

arguments: 設置隊列的其他一些參數, 如 x-message-ttl等

注意: 生產者和消費者都能夠使用queueDeclare 來聲明一個隊列,但是如果消費者在同一個信道上訂閱了另一個隊列,就無法再聲明隊列了。必須先取消訂閱,然后將信道置為"傳輸"模式,之后才能聲明隊列。

對應於exchangeDeclareNoWait方法, 這里也有一個queueDeclareNoWait方法:

void queueDeclareNoWait(String queue, boolean durable, boolean exclusive, boolean autoDelete,
                            Map<String, Object> arguments) throws IOException;

方法的返回值也是void, 表示不需要服務器的任何返回, 同時也需要注意, 在調用完queueDeclareNoWait方法之后, 緊接着使用聲明的隊列時有可能發生異常情況

同樣這里還有一個queueDeclarePassive的方法, 也比較常用, 這個方法用來檢測相應的隊列是否存在, 如果存在則正常返回, 如果不存在則拋出異常, 404 channel excaption, 同時Channel也會被關閉, 方法定義如下:

Queue.DeclareOk queueDeclarePassive(String queue) throws IOException;

與交換器對應,關於隊列也有刪除的相應方法:

1.Queue.DeleteOk queueDelete(String queue) throws IOException;
2.Queue.DeleteOk queueDelete(String queue, boolean ifUnused, boolean ifEmpty) throws IOException;
3.void queueDeleteNoWait(String queue, boolean ifUnused, boolean ifEmpty) throws IOException;

其中queue表示隊列的名稱, ifUnused可以參考 RabbitMQ知識點整理6-exchangeDeclare方法詳解 中, ifEmpty設置為true表示在隊列為空(隊列里面沒有任何消息堆積)的情況下才能夠刪除。

與隊列相關的還有一個有意思的方法一queuePurge ,區別於queueDelete ,這個方法用來清空隊列中的內容,而不刪除隊列本身,具體定義如下:

Queue.PurgeOk queuePurge(String queue) throws IOException;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM