本文主要講述的是個人參考官網及其他前輩部落格,對rabbitmq的一些理解與spring整個rabbitmq.
rabbitmq是乙個由erlang開發的amqp(advanced message queue )的開源實現,官網位址
amqp就是乙個協議,是乙個高階抽象層訊息通訊協議。
雖然在同步訊息通訊的世界裡有很多公開標準(如 cobar的 iiop ,或者是 soap 等),但是在非同步訊息處理中卻不是這樣,只有大企業有一些商業實現(如微軟的 msmq ,ibm 的 websphere mq 等),因此,在 2006 年的 6 月,cisco 、redhat、imatix 等聯合制定了 amqp 的公開標準。也就是說amqp是非同步通訊的乙個協議。
server(broker:**):接受客戶端連線,實現amqp訊息佇列和路由功能的程序。
virtual host:其實是乙個虛擬概念,類似於許可權控制組,乙個virtual host裡面可以有若干個exchange和queue,但是許可權控制的最小粒度是virtual host
connection:連線,對於rabbitmq而言,其實就是乙個位於客戶端和broker之間的tcp連線。
channel:通道,僅僅建立了客戶端到broker之間的連線後,客戶端還是不能傳送訊息的。需要為每乙個connection建立channel,amqp協議規定只有通過channel才能執行amqp的命令。乙個connection可以包含多個channel。之所以需要channel,是因為tcp連線的建立和釋放都是十分昂貴的,如果乙個客戶端每乙個執行緒都需要與broker互動,如果每乙個執行緒都建立乙個tcp連線,暫且不考慮tcp連線是否浪費,就算作業系統也無法承受每秒建立如此多的tcp連線。rabbitmq建議客戶端執行緒之間不要共用channel,至少要保證共用channel的執行緒傳送訊息必須是序列的,但是建議盡量共用connection。
exchange:接受生產者傳送的訊息,並根據binding規則將訊息路由給伺服器中的佇列。exchangetype決定了exchange路由訊息的行為,例如,在rabbitmq中,exchangetype有direct、fanout和topic三種,不同型別的exchange路由的行為是不一樣的。
message queue:訊息佇列,用於儲存還未被消費者消費的訊息
binding:binding聯絡了exchange與message queue。exchange在與多個message queue發生binding後會生成一張路由表,路由表中儲存著message queue所需訊息的限制條件即binding key。當exchange收到message時會解析其header得到routing key,exchange根據routing key與exchange type將message路由到message queue。binding key由consumer在binding exchange與message queue時指定,而routing key由producer傳送message時指定,兩者的匹配方式由exchange type決定。
關於rabbitmq的幾種使用場景,這裡都是根據官網來的,具體的**實現,這裡就不粘, 簡單總結一下。
乙個生產者、乙個消費者,生產者直接將訊息傳送到佇列,消費者消費訊息
乙個生產者、兩個消費者,生產者將訊息直接傳送到佇列,消費者消費訊息
注意:在消費者**裡沒有這個設定的話channel.basicqos(1),是平均分配, 加上這個設定,就是能者多勞,這種更加符合實際的應用場景;
乙個生產者、多個消費者,生產者將訊息傳送到exchange中,消費者通過路由規則接受訊息
有三種型別的exchanges:direct, fanout,topic。 每個實現了不同的路由演算法(routing algorithm)。
· direct exchange:如果 routing key 匹配, 那麼message就會被傳遞到相應的queue中。其實在queue建立時,它會自動的以queue的名字作為routing key來繫結那個exchange。
·fanout exchange: 會向響應的queue廣播【沒有路由規則】。
·topic exchange: 對key進行模式匹配,比如ab*可以傳遞到所有ab*的queue。
這塊還在學習中,後續補充......
3.1新增依賴
org.springframework.amqp
spring-rabbit
1.4.0.release
com.rabbitmq
amqp-client
3.4.1
3.2 新增spring-rabbitmq.xml
rabbitmq 連線服務配置
3.3 rabbitmq.properties內容
mq.host=127.0.0.1
mq.username=root
mq.password=root
mq.port=5672
#虛擬主機
mq.vhost=/test-vhost
3.4介面與實現類
//介面
public inte***ce mqproducer
//實現類
@service
public class mqproducerimpl implements mqproducer
catch (exception e) }}
3.5 佇列監聽
@component
public class queuelistenter implements messagelistener
catch(exception e)}}
3.6 配置***
3.7 測試類
@runwith(value = springjunit4classrunner.class)
@contextconfiguration(locations = )
public class testqueue
}
後台日誌:
[org.springframework.context.support.defaultlifecycleprocessor] - starting beans in phase 2147483647
*****====傳送訊息開始**********===訊息:hello rabbitmq!
整合成功!
看日誌:
根據上面3.2節 spring的整合配置檔案之後,還需要配置rabbitmq 的客戶端。配置貼圖:
根據上面一章,新增新的queue之後,都需要手動配置客戶端,這樣顯得很麻煩,這裡有配置,新增下面配置,客戶端我們就不用再關心,重點放在我們的**上面。如下配置:
"dealdataqueue以上內容都是我個人學習補充,由於能力有限,難免出現錯誤,如有錯誤,多謝指正。" name="
test.deal.data.queue
" durable="
true
" auto-delete="
false
" exclusive="
false
"/>
"xx-exchange
" id="
xx-exchange
" durable="
true
" auto-delete="
false
">
"dealdataqueue
" key="
test.deal.data.queue
"/>
"dealdataqueuelitener
"class="
com.***.dealdatalistener
"/>
"rabbitconnectionfactory
" acknowledge="
auto
">
"dealdataqueue
"ref="
dealdataqueuelitener
"/>
"rabbittemplate
" exchange="
xx-exchange
" connection-factory="
rabbitconnectionfactory
" />
rabbitMQ的簡單介紹與安裝
簡介 rabbitmq 是實現amqp 高階訊息佇列協議 的訊息中介軟體的一種,最初起源於金融系統,用於在分布式系統中儲存 訊息,在易用性 擴充套件性 高可用性等方面表現不俗。訊息中介軟體主要用於元件之間的解耦,訊息的傳送者無需知道訊息使用者的存在,反之亦然。如乙個日誌系統,很容易使用 rabbit...
RabbitMQ的安裝以及介紹
rabbitmq是乙個由erlang開發的基於amqp advanced message queue protocol 協議的開源實現。用於在分布式系統中儲存 訊息,在易用性 擴充套件性 高可用性等方面都非常的優秀。是當前最主流的訊息中介軟體之一。一 安裝 2 修改環境變數path,增加erlang...
Spr咖啡的創業之道
以發展咖啡相關產品及原物料業務起家,並在美國伊利諾州state of illinois及北美地區取得了卓越成果的美國spr國際公司 spr international corp.u.s.a 為spr控股公司 spr holding co,ltd b.v.i 所屬。隨著中國對世界開放及吸引外資的各種機...