注:生產者和消費者都可以聲明一個交換器。如果嘗試聲明一個已經存在的交換器或者隊列,只要聲明的參數完全匹配現存的交換器或隊列,RabbitMq就可以聲明都不做,併成功返回。如果聲明的參數不匹配則會拋出異常。
exchangeDeclare()
exchange:交換器
type:交換器的類型,常見的如fanout、direct、topic
durable:設置是否持久化,true表示持久化。持久化可以將交換器存盤,在服務器重啓的時候不會丟失相關信息。
autoDelete:設置是否自動刪除。true表示自動刪除。自動刪除的前提是至少有一個隊列或者交換器與這和交換器綁定,之後所有與這個交換器綁定的隊列或者交換器都與此解綁。(不能錯誤的理解爲:當於此交換器連接的客戶端都斷開時)
internal:設置是否內置的。true表示是內置的交換器,客戶端程序無法直接發送消息到這個交換器中,只能通過交換器路由到交換器這種方式。
argument:其他的一些結構化參數,比如:alternate-exchange
備份交換器:
也可以稱之爲“備胎交換器”,生產者發送消息時,對應交換器未找到綁定的隊列,消息會默認丟失掉,可以使用備份交換器(建議類型爲fanout,如果爲其他的類型,rountingKey不匹配同樣會丟失)進行綁定,這樣未被路由的消息會存儲到備份交換器綁定的隊列上。(在聲明消息發送交換器時,增加參數alternate-exchange值爲備份交換器名來實現)
Map<String, Object> args = new HashMap<String, Object>();
args.put("alternate-exchange", "exchange_backup_ly_demo");
//聲明發送消息的交換器
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, args);
//聲明備份交換器
channel.exchangeDeclare("exchange_backup_ly_demo", "fanout", true, false, null);
//聲明發送消息的隊列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
//將交換器與隊列通過路由鍵綁定
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
//聲明備份交換器的隊列
channel.queueDeclare("queue_backup_ly_demo", true, false, false, null);
//將交換器與隊列通過路由鍵綁定
channel.queueBind("queue_backup_ly_demo", "exchange_backup_ly_demo", "");
queueDeclare()
queue:隊列名稱
durable:設置是否持久化。true表示持久化。持久化的隊列會存盤,在服務器重啓的時候可以保證不丟失相關信息。
exclusive:設置是否排他。true表示隊列是排他的。排他的隊列僅對“首次”聲明的連接可見,並在連接斷開時自動刪除。(這裏“首次”是指如果一個連接已經聲明瞭一個排他隊列,其他的連接是不允許建立同名的排他隊列)排他隊列是基於連接可見的,同一個連接的不同信道是可以同時訪問同一連接創建的排他隊列。即使隊列是持久化的,一旦連接關閉或者客戶端退出,該排他隊列都會被自動刪除 ,這種隊列適用於一個客戶端同時發送和讀取消息的應用場景。
autoDelete:設置是否自動刪除。true表示隊列自動刪除。前提是至少有一個消費者連接到這個隊列,之後所有與這個隊列連接的消費者都斷開時,纔會自動刪除。注意:生產者客戶端創建這個隊列,或者沒有消費者客戶端與這個隊列連接時,都不會自動刪除這個隊列。
arguments:其他的一些結構化參數,比如:x-message-ttl、x-expires、x-max-length、x-max-length-bytes等
注意:
1.生產者和消費者都能夠使用queueDeclare來聲明一個隊列,但是如果消費者在同一個信道上訂閱了另一個隊列,就無法再聲明隊列了。必須先取消訂閱,然後將信道置爲“傳輸”模式,之後才能聲明隊列。
2.RabbitMq的消息存儲在隊列中,交換器的使用並不真正消耗服務器的性能,而隊列會。如果要衡量RabbitMq當前的QPS只需看隊列的即可。
DLX(死信隊列):
1.消息在一個隊列中變成死信之後,它能被重新發送到另一個交換器中.
2.場景:
A.消息被拒絕(消費者拒絕消費此消息,Basic.Reject/Basic.Nack),並且設置requeue參數爲false
B.消息過期.
C.隊列達到最大長度
延遲隊列:
1.延遲隊列存儲的對象是對應的延遲消息(指當消息被髮送以後,並不想讓消費者立刻拿到消息,而是等待特定時間後,消費者才能拿到這個消息進行消費)
2.在AMQP協議中,或者RabbitMq本身沒有直接支持延遲隊列的功能,但是可以通過(DLX和TTL)模擬出延遲隊列的功能.
優先級隊列:
即具有高優先級的隊列具有高的優先權,優先級高的消息具備優先被消費的特權。
1.先通過設置隊列參數x-max-priority配置一個隊列的最大優先級
2.在發送消息中設置當前消息的優先級.(優先級默認最低爲0, 最高爲隊列設置的最大優先級)