最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

RabbitMQ教程 | RabbitMQ的發(fā)布訂閱模式Publish/Subscribe精講

2023-11-01 15:54 作者:袁庭新  | 我要投稿

各位小伙伴很久不見了,袁老師今兒又要給大家分享干貨了。我們知道RabbitMQ有簡(jiǎn)單模式、工作隊(duì)列模式、發(fā)布訂閱模式、路由模式、主題模式、遠(yuǎn)程過程調(diào)用模式、發(fā)布者確認(rèn)模式等。這么多模式,你可能一下子很難全部吸收,今天袁老師主要給大家介紹發(fā)布訂閱模式Publish/Subscribe的相關(guān)內(nèi)容。

SpringBoot整合RabbitMQ中間件實(shí)現(xiàn)消息服務(wù),主要圍繞3個(gè)部分的工作進(jìn)行展開:定制中間件、消息發(fā)送者發(fā)送消息、消息消費(fèi)者接收消息。其中,定制中間件是比較麻煩的工作,且必須預(yù)先定制。

下面袁老師以用戶注冊(cè)成功后,同時(shí)發(fā)送郵件通知和短信通知這一場(chǎng)景為例進(jìn)行功能介紹, 分別使用基于API、基于配置類和基于注解這3種方式,來實(shí)現(xiàn)Publish/Subscribe工作模式的整合。

01?基于API的方式

基于API的方式,是指使用Spring框架提供的API管理類AmqpAdmin定制消息發(fā)送組件,并進(jìn)行消息的發(fā)送。這種定制消息發(fā)送組件的方式,與在RabbitMQ可視化界面上通過對(duì)應(yīng)面板進(jìn)行組件操作的實(shí)現(xiàn)基本一樣,都是通過管理員的身份,預(yù)先手動(dòng)聲明交換器、隊(duì)列、路由鍵等,然后組裝消息隊(duì)列供應(yīng)用程序調(diào)用,從而實(shí)現(xiàn)消息服務(wù)。下面我們就對(duì)這種基于API的方式進(jìn)行講解和演示。

1.1?使用AmqpAdmin定制消息發(fā)送組件

我們先打開chapter08項(xiàng)目的測(cè)試類Chapter08ApplicationTests,在該測(cè)試類中先引入AmqpAdmin管理類定制Publish/Subscribe工作模式所需的消息組件。

執(zhí)行上述單元測(cè)試方法amqpAdmin(),驗(yàn)證RabbitMQ消息組件的定制效果。單元測(cè)試方法執(zhí)行成功后,通過RabbitMQ可視化管理頁面的Exchanges面板查看效果。

從上圖可以看出,在RabbitMQ可視化管理頁面的Exchanges面板中,新出現(xiàn)了一個(gè)名稱為fanout_exchange的交換器(其他7個(gè)交換器是RabbitMQ自帶的),且其類型是我們?cè)O(shè)置的fanout類型。我們可以單擊fanout_exchange交換器進(jìn)入查看。

從上圖可以看出,在fanout_exchange交換器詳情頁面中展示有該交換器的具體信息,還有與之綁定的fanout_queue_email和fanout_queue_sms兩個(gè)消息隊(duì)列,并且與程序中設(shè)置的綁定規(guī)則一致。切換到Queues面板頁面,查看定制生成的消息隊(duì)列信息。

從上圖可以看出,在Queues隊(duì)列面板頁面中,展示有定制的消息隊(duì)列信息,這與程序中定制的消息隊(duì)列一致,我們可以單擊消息隊(duì)列名稱查看每個(gè)隊(duì)列的詳情。

通過上述操作可以發(fā)現(xiàn),在管理頁面中提供了消息組件交換器、隊(duì)列的定制功能。在程序中使用Spring框架提供的管理員API組件AmqpAdmin,定制消息組件和在管理頁面上手動(dòng)定制消息組件的本質(zhì)是一樣的。

1.2?消息發(fā)送著發(fā)送消息

完成消息組件的定制工作后,創(chuàng)建消息發(fā)送者發(fā)送消息到消息隊(duì)列中。發(fā)送消息時(shí),我們可以借助一個(gè)實(shí)體類傳遞消息,需要預(yù)先創(chuàng)建一個(gè)實(shí)體類對(duì)象。

首先,在chapter08項(xiàng)目中創(chuàng)建名為com.ytx.domain的包,并在該包下創(chuàng)建一個(gè)實(shí)體類User。

其次,我們?cè)陧?xiàng)目測(cè)試類Chapter08ApplicationTests中,使用Spring框架提供的RabbitTemplate模板類實(shí)現(xiàn)消息發(fā)送。

上述代碼中,我們先使用@Autowired注解,引入消息中間件管理的RabbitTemplate組件對(duì)象,然后使用該模板工具類的convertAndSend(String exchange, String routingKey, Object object)方法進(jìn)行消息發(fā)布。此方法中的第1個(gè)參數(shù)表示發(fā)送消息的交換器,這個(gè)參數(shù)值要與之前定制的交換器名稱一致;第2個(gè)參數(shù)表示路由鍵,因?yàn)閷?shí)現(xiàn)的是Publish/Subscribe工作模式,所以不需要指定;第3個(gè)參數(shù)是發(fā)送的消息內(nèi)容,接收Object類型。

然后,執(zhí)行上述消息發(fā)送的測(cè)試方法subPublisher(),控制臺(tái)執(zhí)行效果見下圖所示。

從上圖可以看出,發(fā)送實(shí)體類對(duì)象消息時(shí)程序發(fā)生異常,從異常信息“SimpleMessageConverter only supports String, byte[] and Serializable payloads”可以看出,消息發(fā)送過程中默認(rèn)使用了SimpleMessageConverter轉(zhuǎn)換器進(jìn)行消息轉(zhuǎn)換存儲(chǔ),該轉(zhuǎn)換器只支持字符串或?qū)嶓w類對(duì)象序列化后的消息。而測(cè)試類中發(fā)送的是User實(shí)體類對(duì)象消息,所以發(fā)生異常。

如果要解決上述消息中間件發(fā)送實(shí)體類消息出現(xiàn)的異常,我們通??梢圆捎脙煞N解決方案:第一種是執(zhí)行JDK自帶的Serializable序列化接口;第二種是定制其他類型的消息轉(zhuǎn)化器。兩種實(shí)現(xiàn)方式都可行,相對(duì)于第二種實(shí)現(xiàn)方式而言,第一種方式實(shí)現(xiàn)后的可視化效果較差,轉(zhuǎn)換后的消息無法辨識(shí),所以一般使用第二種方式。

接著我們?cè)赾hapter08項(xiàng)目中創(chuàng)建名為com.ytx.config的包,并在該包下創(chuàng)建一個(gè)RabbitMQ消息配置類RabbitMQConfig。

代碼中創(chuàng)建一個(gè)RabbitMQ消息配置類RabbitMQConfig,并在該配置類中通過@Bean注解自定義一個(gè)Jackson2JsonMessageConverter類型的消息轉(zhuǎn)換器組件,該組件的返回值必須為MessageConverter類型。

再次執(zhí)行subPublisher()方法,該方法執(zhí)行成功后,查看RabbitMQ可視化管理頁面Queues面板信息。

從上圖可以看出,消息發(fā)送完成后,Publish/Subscribe工作模式下綁定的兩個(gè)消息隊(duì)列中各自擁有一條待接收的消息, 由于目前尚未提供消息消費(fèi)者,所以剛才測(cè)試類發(fā)送的消息會(huì)暫存在隊(duì)列中。進(jìn)入隊(duì)列詳情頁面查看消息。

1.3?消息消費(fèi)者接收消息

在chapter08項(xiàng)目中創(chuàng)建名為com.ytx.service的包,并在該包下創(chuàng)建一個(gè)針對(duì)RabbitMQ消息中間件進(jìn)行消息接收和處理的業(yè)務(wù)類RabbitMQService。

上述代碼中,創(chuàng)建了一個(gè)接收處理RabbitMQ消息的業(yè)務(wù)處理類RabbitMQService,在該類中使用Spring框架提供的@RabbitListener注解,我們可以監(jiān)聽隊(duì)列名稱為fanout_queue_email和fanout_queue_sms的消息,監(jiān)聽的這兩個(gè)隊(duì)列是前面指定發(fā)送并存儲(chǔ)消息的消息隊(duì)列。

需要說明的是,使用@RabbitListener注解監(jiān)聽隊(duì)列消息后,一旦服務(wù)啟動(dòng)且監(jiān)聽到指定的隊(duì)列中有消息存在(目前兩個(gè)隊(duì)列中各有一條相同的消息),對(duì)應(yīng)注解的方法就會(huì)立即接收并消費(fèi)隊(duì)列中的消息。另外,在接收消息的方法中,參數(shù)類型可以與發(fā)送的消息類型保持一致,或者使用Object類型和Message類型。如果使用與消息類型對(duì)應(yīng)的參數(shù)接收消息的話,只能夠得到具體的消息體信息;如果使用Object或者M(jìn)essage類型參數(shù)接收消息的話,還可以獲得除了消息體外的消息參數(shù)信息MessageProperties。

啟動(dòng)chapter08項(xiàng)目,控制臺(tái)顯示的消息消費(fèi)效果如下圖所示。

從上圖可以看出,項(xiàng)目啟動(dòng)成功后,消息消費(fèi)者監(jiān)聽到消息隊(duì)列中存在的兩條消息,并進(jìn)行了各自的消費(fèi)。與此同時(shí),通過RabbitMQ可視化管理頁面的Queues面板查看隊(duì)列消息情況,會(huì)發(fā)現(xiàn)兩個(gè)隊(duì)列中存儲(chǔ)的消息已經(jīng)被消費(fèi)。至此,一條完整的消息發(fā)送、 消息中間件存儲(chǔ)、消息消費(fèi)的Publish/Subscribe(發(fā)布訂閱模式)工作模式的業(yè)務(wù)案例已經(jīng)實(shí)現(xiàn)。

注意,如果沒有引入Spring Web模塊的依賴,啟動(dòng)chapter08項(xiàng)目時(shí),消息消費(fèi)者接收消息會(huì)報(bào)以下錯(cuò)誤。

小提示:

上述代碼中,使用的是開發(fā)中常用的@RabbitListener注解,來監(jiān)聽指定名稱隊(duì)列的消息情況,這種方式會(huì)在監(jiān)聽到指定隊(duì)列存在消息后立即進(jìn)行消費(fèi)處理。除此之外,我們還可以使用RabbitTemplate模板類的receiveAndConvert(String queueName)方法手動(dòng)消費(fèi)指定隊(duì)列中的消息。

02?基于配置類的方式

基于配置類的方式,主要講的是使用SpringBoot框架提供的@Configuration注解,配置定制消息發(fā)送組件,并進(jìn)行消息發(fā)送。下面我們來對(duì)這種基于配置類的方式進(jìn)行講解和演示。

打開RabbitMQ消息配置類RabbitMQConfig,在該配置類中使用基于配置類的方式定制消息發(fā)送相關(guān)組件。

上述代碼中,使用@Bean注解定制了3種類型的Bean組件,這3種組件分別表示交換器、消息隊(duì)列和消息隊(duì)列與交換器的綁定。這種基于配置類方式定制的消息組件,其實(shí)現(xiàn)和基于API方式定制的消息組件完全一樣,只不過是實(shí)現(xiàn)方式不同而已。

按照消息服務(wù)整合實(shí)現(xiàn)步驟,完成消息組件的定制后,還需要編寫消息發(fā)送者和消息消費(fèi)者,而在基于API的方式中已經(jīng)實(shí)現(xiàn)了消息發(fā)送者和消息消費(fèi)者,并且基于配置類方式定制的消息組件名稱,和之前測(cè)試用的消息發(fā)送和消息消費(fèi)組件名稱都是一致的,所以這里我們可以直接重復(fù)使用。

重新運(yùn)行消息發(fā)送者測(cè)試方法subPublisher(),消息消費(fèi)者可以自動(dòng)監(jiān)聽并消費(fèi)消息隊(duì)列中存在的消息,效果與基于API的方式測(cè)試效果一樣。

03?基于注解的方式

基于注解的方式指的是使用Spring框架的@RabbitListener注解定制消息發(fā)送組件并發(fā)送消息。

在消息接收和處理的業(yè)務(wù)類RabbitMQService中,將針對(duì)郵件業(yè)務(wù)和短信業(yè)務(wù)處理的消息消費(fèi)者方法進(jìn)行注釋,使用@RabbitListener注解及其相關(guān)屬性定制消息發(fā)送組件。

上述代碼中,使用@RabbitListener注解及其相關(guān)屬性定制了兩個(gè)消息組件的消費(fèi)者,這兩個(gè)消費(fèi)者都接收實(shí)體類User并消費(fèi)。在@RabbitListener注解中,bindings屬性用于創(chuàng)建并綁定交換器和消息隊(duì)列組件,需要注意的是,為了能使兩個(gè)消息組件的消費(fèi)者接收到實(shí)體類User,需要我們?cè)诙ㄖ平粨Q器時(shí)將交換器類型type設(shè)置為fanout。另外,bindings屬性的@QueueBinding注解除了有value、exchange屬性外,還有key屬性用于定制路由鍵routingKey(當(dāng)前發(fā)布訂閱模式不需要)。

重啟測(cè)試方法subPublisher(),消息消費(fèi)者可以自動(dòng)監(jiān)聽并消費(fèi)消息隊(duì)列中存在的消息,效果與基于API的方式測(cè)試效果一樣。

至此,我們就在SpringBoot中完成了基于API、基于配置類和基于注解這3種方式,來實(shí)現(xiàn)Publish/Subscribe工作模式的整合講解。在這3種實(shí)現(xiàn)消息服務(wù)的方式中,基于API的方式相對(duì)簡(jiǎn)單、直觀,但容易與業(yè)務(wù)代碼產(chǎn)生耦合;基于配置類的方式相對(duì)隔離、容易統(tǒng)一管理、符合Spring Boot框架思想;基于注解的方式清晰明了、方便各自管理,但是也容易與業(yè)務(wù)代碼產(chǎn)生耦合。

在實(shí)際開發(fā)中,使用基于配置類的方式和基于注解的方式較為常見,基于API的方式則偶爾使用,當(dāng)然大家要根據(jù)實(shí)際情況進(jìn)行具體選擇。

04?總結(jié)回顧

今天袁老師給大家分別介紹了基于API方式、配置類方式和注解的3種消息隊(duì)列,并教會(huì)了大家實(shí)現(xiàn)發(fā)布訂閱Publish/Subscribe模式的整合及代碼實(shí)現(xiàn),要求大家重點(diǎn)掌握基于注解方式的實(shí)現(xiàn)哦。有關(guān)RabbitMQ的其他內(nèi)容,袁老師會(huì)在后續(xù)的文章中不斷進(jìn)行更新,歡迎大家持續(xù)關(guān)注。

今天的內(nèi)容,袁老師就給大家介紹到這里,現(xiàn)在你學(xué)會(huì)了嗎?關(guān)注「袁庭新」,干貨天天都不斷!


RabbitMQ教程 | RabbitMQ的發(fā)布訂閱模式Publish/Subscribe精講的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
合肥市| 尚义县| 鸡东县| 富顺县| 清原| 丹东市| 抚顺县| 沙河市| 温泉县| 九江县| 望城县| 鄯善县| 璧山县| 开阳县| 云和县| 浙江省| 紫云| 汉中市| 凌云县| 资兴市| 伊川县| 龙岩市| 抚宁县| 满洲里市| 安宁市| 通州区| 黄石市| 卢湾区| 大邑县| 衡山县| 旬邑县| 乌兰县| 云林县| 廊坊市| 通榆县| 上饶市| 莎车县| 鹿泉市| 澜沧| 神木县| 门源|