RabbitMQ的介紹與spring整合

2021-09-24 17:46:24 字數 4356 閱讀 3976

本文主要講述的是個人參考官網及其他前輩部落格,對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 所屬。隨著中國對世界開放及吸引外資的各種機...