本文主要講解 routing 和 topics 兩種工做模式,其中 topics 只是在 routing 的基礎上增長了一個 routingkey 的正則匹配。接下來會詳細介紹。ui
以前說到的 Publish/Subscribe 是把一個消息發給多個消費者,而且每一個消費者接收到的消息是同樣的。而此次說到的Routing 模式,則是經過增長一個組件(Bingings),使咱們的消費者能訂閱到本身感興趣的消息。code
Bindings 會將 exchanges 和 queue 聯繫在一塊兒,queue 經過 bindings 從 exchangs 中訂閱本身感興趣的消息。隊列
Bindings 提供了一個 RoutingKey 參數 channel.queueBind(queueName, EXCHANGE_NAME, routingkey); 其實在上一篇中,也有這個參數, 只不過這個參數是一個空字符串,由於 這個key和 exchange type是息息相關的,fanout 類型的 exchange 的key就是 空字符串。ip
direct exchange字符串
一個消息 會根據 routing key 來匹配本身應該去哪一個隊列。get
Multiple bindingsit
direct exchange 也能夠實現 fanout exchange 的做用,只要隊列綁定相同的 routing key,一個消息一樣能夠發到多個隊列當中基礎
channel.basicPublish(EXCHANGE_NAME, routingkey, null, message.getBytes()); channel.queueBind(queueName, EXCHANGE_NAME, routingkey);
topic exchange 只是在 routing 的基礎上,將routingkey 改爲了相似正則匹配, routingkey 由單詞 和 點 組成 ,長度限制在 255 bytechannel
例如:lazy.orange.rabbit 或者 quick.orange.fox, 除此以外, 還能夠用queue
例如 :.orange.rabbit, .orange., quick.# 可是若是單詞個數不匹配,也是不行的, 好比, lazy.orange.rabbit. 或者 *.orange.rabbit.other 可是 '#' 這樣用是能夠的, lazy.orange.rabbit.#;