參考翻譯自: RabbitMQ官網html
生產者並不是將消息直接發送到queue,而是發送到exchange
中,具體將消息發送到特定的隊列仍是多個隊列,或者是丟棄,取決於exchange
的類型java
當生產/消費exchange
時,能夠綁定隊列到exchange
中:服務器
channel.queueBind(queueName, EXCHANGE_NAME, "");
bind方法將一個隊列和一個exchange綁定到一塊兒,第三個參數 routing key,至關於描述這個綁定關係的key,會根據不一樣類型的exchange,來決定將消息發送到queue中,多個queue中,或者消費時,將消息遞送到綁定的queue中ui
fanout
將收到的全部消息發送到全部的已知隊列中.spa
channel.exchangeDeclare("logs", "fanout");
channel.basicPublish( "logs", "", null, message.getBytes());
當咱們消費一個fanout類型的exchange時,exchange發送消息到多個queue,而咱們想要消費全部的queue,而不是其中一部分,而咱們不知道消息具體被髮送到哪一個queue,也無法指定多個queue,此時須要一個臨時queue翻譯
String queueName = channel.queueDeclare().getQueue();
這樣定義了一個臨時queue,這個隊列非持久,消費者獨有的,會被自動刪除,當消費者斷開鏈接時,臨時queue自動被刪除code
爲了告訴exchange發送消息到咱們定義的臨時queue,須要進行綁定操做:htm
channel.queueBind(queueName, "logs", "");
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
類型有時候,咱們須要發佈/訂閱消息有多個篩選類型,好比發佈一個動物消息:移動速度,顏色,類別.當須要訂閱全部同一個顏色的動物時,好比所有移動速度,黑色,全部類別.此時涉及到模糊匹配,使用
fanout和
direct類型不符合要求,此時要用到
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
的命令sudo rabbitmqctl list_exchanges
列出服務器上的exchanges,amq.*
開頭的exchange和default(沒有名字)的exchange是默認建立的.通常不大可能直接使用.
未命名的exchange未命名的exchange默認將消息分發給routingKey定義的名稱的隊列