RBMQ發佈和訂閱消息

RBMQ發佈和訂閱消息

exchange

參考翻譯自: RabbitMQ官網html


生產者並不是將消息直接發送到queue,而是發送到exchange中,具體將消息發送到特定的隊列仍是多個隊列,或者是丟棄,取決於exchange的類型java

exchange的類型

  • direct
  • topic
  • headers
  • fanout

bindings(綁定隊列)

當生產/消費exchange時,能夠綁定隊列到exchange中:服務器

channel.queueBind(queueName, EXCHANGE_NAME, "");

 

bind方法將一個隊列和一個exchange綁定到一塊兒,第三個參數 routing key,至關於描述這個綁定關係的key,會根據不一樣類型的exchange,來決定將消息發送到queue中,多個queue中,或者消費時,將消息遞送到綁定的queue中ui

fanout類型

fanout將收到的全部消息發送到全部的已知隊列中.spa

定義一個fanout類型的exchange

channel.exchangeDeclare("logs", "fanout");

 

發送消息到exchange中

channel.basicPublish( "logs", "", null, message.getBytes());

 

消費exchange

當咱們消費一個fanout類型的exchange時,exchange發送消息到多個queue,而咱們想要消費全部的queue,而不是其中一部分,而咱們不知道消息具體被髮送到哪一個queue,也無法指定多個queue,此時須要一個臨時queue翻譯

Temporary Queue
String queueName = channel.queueDeclare().getQueue();

 

這樣定義了一個臨時queue,這個隊列非持久,消費者獨有的,會被自動刪除,當消費者斷開鏈接時,臨時queue自動被刪除code

爲了告訴exchange發送消息到咱們定義的臨時queue,須要進行綁定操做:htm

channel.queueBind(queueName, "logs", "");

 

direct類型

生產隊列

channel.queueBind(queueName, EXCHANGE_NAME, "black");
channel.queueBind(queueName1, EXCHANGE_NAME, "white");

 

當exchange爲direct類型時,會將exchange和queuename綁定到一塊兒綁定key爲black,將exchange和queuename1綁定到一塊兒,綁定key爲white.fonout類型會忽略第三個參數,當發送消息時:blog

channel.basicPublish(EXCHANGE_NAME, "black", null, message.getBytes());
channel.basicPublish(EXCHANGE_NAME, "white", null, message1.getBytes());

 

此時,會將message發送到綁定的queuename隊列中,message1發送到綁定的queuename1隊列中.three

綁定多個隊列到一個binding key時,至關於廣播,會將消息發送到多個隊列中

消費隊列

String queueName = channel.queueDeclare().getQueue();

for(String severity : argv){
  channel.queueBind(queueName, EXCHANGE_NAME, severity);
}

 

當消費一個direct類型的exchange時,經過binding key 決定消費哪一個隊列

topic類型

有時候,咱們須要發佈/訂閱消息有多個篩選類型,好比發佈一個動物消息:移動速度,顏色,類別.當須要訂閱全部同一個顏色的動物時,好比所有移動速度,黑色,全部類別.此時涉及到模糊匹配,使用fanoutdirect類型不符合要求,此時要用到topic`類型

發佈消息

 channel.basicPublish(EXCHANGE_NAME, "quick.orange.rabbit", null, message.getBytes());
 channel.basicPublish(EXCHANGE_NAME, "lazy.orange.elephant", null, message.getBytes());

 

發佈了兩個routing key,一個快,橙色,兔子,一個慢,橙色,大象,這兩個routing key的消息發到了不一樣的隊列中

消費消息

channel.queueBind(queueName, EXCHANGE_NAME, "*.orange.*");

 

經過綁定隊列,到模糊匹配routing key上,當全部符合匹配規則的routing key的消息都會被消費者隊列所消費

關於exchange的命令

列出exchanges

sudo rabbitmqctl list_exchanges

 

列出服務器上的exchanges,amq.*開頭的exchange和default(沒有名字)的exchange是默認建立的.通常不大可能直接使用.

未命名的exchange未命名的exchange默認將消息分發給routingKey定義的名稱的隊列

相關文章
相關標籤/搜索