Spring Boot企業(yè)級開發(fā)教程(第2版) 課件 第8章 Spring Boot消息服務(wù)_第1頁
Spring Boot企業(yè)級開發(fā)教程(第2版) 課件 第8章 Spring Boot消息服務(wù)_第2頁
Spring Boot企業(yè)級開發(fā)教程(第2版) 課件 第8章 Spring Boot消息服務(wù)_第3頁
Spring Boot企業(yè)級開發(fā)教程(第2版) 課件 第8章 Spring Boot消息服務(wù)_第4頁
Spring Boot企業(yè)級開發(fā)教程(第2版) 課件 第8章 Spring Boot消息服務(wù)_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第8章SpringBoot消息服務(wù)《SpringBoot企業(yè)級開發(fā)教程(第2版)》學(xué)習(xí)目標(biāo)/Target熟悉常見消息中間件,能夠說出4種常見的消息中間件名稱和特點熟悉使用消息服務(wù)的好處,能夠通過不同的場景說出使用消息服務(wù)的好處了解RabbitMQ簡介,能夠說出RabbitMQ消息代理流程熟悉RabbitMQ工作模式,能夠說出RabbitMQ支持的工作模式,以及每種模式的工作原理掌握RabbitMQ的下載、安裝和配置,能夠在Windows平臺安裝和配置RabbitMQ,并成功啟動RabbitMQ學(xué)習(xí)目標(biāo)/Target掌握RabbitMQ入門案例,能夠獨立實現(xiàn)RabbitMQ入門案例掌握SpringBoot整合RabbitMQ環(huán)境搭建,能夠在SpringBoot項目中整合RabbitMQ掌握使用Routing模式實現(xiàn)消息服務(wù),能夠在SpringBoot項目中使用Routing模式實現(xiàn)消息服務(wù)掌握使用Topics模式實現(xiàn)消息服務(wù),能夠在SpringBoot項目中使用Topics模式實現(xiàn)消息服務(wù)掌握使用Publish/Subscribe模式實現(xiàn)消息服務(wù),能夠在SpringBoot項目中使用Publish/Subscribe模式實現(xiàn)消息服務(wù)章節(jié)概述/Summary在實際項目開發(fā)中,有時候需要與其他系統(tǒng)進行集成完成相關(guān)業(yè)務(wù)功能,這種情況最原始的做法是程序內(nèi)部相互調(diào)用,除此之外,還可以使用消息服務(wù)中間件進行業(yè)務(wù)處理,使用消息服務(wù)中間件處理業(yè)務(wù)能夠提升系統(tǒng)的異步通信和擴展解耦能力。SpringBoot對消息服務(wù)管理提供了非常好的支持,下面將對SpringBoot消息服務(wù)的原理和整合使用進行詳細(xì)講解。目錄/Contents8.18.2消息服務(wù)概述RabbitMQ快速入門8.3SpringBoot與RabbitMQ整合實現(xiàn)消息服務(wù)概述8.18.1

消息服務(wù)概述Java中的消息服務(wù)是指不同應(yīng)用程序之間或同一個應(yīng)用程序的不同組件之間通信的API,包括創(chuàng)建、發(fā)送、讀取消息等,用于支持JAVA應(yīng)用程序開發(fā)。在J2EE中,當(dāng)兩個組件使用Java消息服務(wù)進行通信時,發(fā)送消息的組件通常稱為消息生產(chǎn)者,使用發(fā)送過來的數(shù)據(jù)的組件稱為消息消費者,消息生產(chǎn)者與消息消費者之間并不是直接相連,而是通過一個共同的消息收發(fā)服務(wù)連接起來,消息生產(chǎn)者和消息消費者雙方無須相互了解消息服務(wù)的實現(xiàn)細(xì)節(jié),只需了解交換消息的格式即可。消息服務(wù)這種機制實現(xiàn)了組件之間的解耦,因此更加靈活。下面對常用消息中間件以及使用消息服務(wù)的優(yōu)勢進行講解。8.1.1常用消息中間件先定一個小目標(biāo)!

先定一個小目標(biāo)!熟悉常見消息中間件,能夠說出4種常見的消息中間件名稱和特點8.1.1常用消息中間件消息隊列(MessageQueue,MQ)是一種能實現(xiàn)消息生產(chǎn)者到消息消費者單向通信的通信模型,通常將實現(xiàn)了這個模型的組件稱為消息隊列中間件(簡稱消息中間件)。消息中間件通過高效可靠的消息傳遞機制進行與平臺無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進行分布式系統(tǒng)的集成。目前開源的消息中間件可謂是琳瑯滿目,能讓大家耳熟能詳?shù)挠泻芏?,例如ActiveMQ、RabbitMQ、Kafka、RocketMQ等,也有直接使用Redis充當(dāng)消息隊列的案例,而這些消息中間件各有側(cè)重,在實際選型時,需要結(jié)合具體需求來選擇。下面對常用的消息中間件進行介紹。8.1.1常用消息中間件1.ActiveMQActiveMQ是采用Java語言編寫的完全基于Java消息服務(wù)(JavaMessageService,JMS)規(guī)范的面向消息的中間件,它為應(yīng)用程序提供高效、可擴展的、穩(wěn)定的、安全的企業(yè)級消息通信。ActiveMQ豐富的API和多種集群構(gòu)建模式使其成為業(yè)界老牌的消息中間件,在中小型企業(yè)中應(yīng)用廣泛。相較于后續(xù)出現(xiàn)的RabbitMQ、RocketMQ、Kafka等消息中間件來說,ActiveMQ性能相對較弱,在如今的高并發(fā)、大數(shù)據(jù)處理的場景下顯得力不從心,經(jīng)常會出現(xiàn)一些問題,例如消息延遲、堆積、堵塞等。8.1.1常用消息中間件2.RabbitMQRabbitMQ是使用Erlang語言開發(fā)的開源消息隊列系統(tǒng),支持高級消息隊列協(xié)議(AdvancedMessageQueuingProtocol,AMQP,可擴展通訊和表示協(xié)議,ExtensibleMessagingandPresenceProtocol,XMPP)等。AMQP是應(yīng)對大規(guī)模并發(fā)活動提供統(tǒng)一消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)高級消息隊列協(xié)議,專為面向消息的中間件設(shè)計,該協(xié)議更多用在企業(yè)系統(tǒng)內(nèi)對數(shù)據(jù)一致性、穩(wěn)定性和可靠性要求很高的場景,對性能和吞吐量的要求不是很高。RabbitMQ具有并發(fā)能力強、性能好、消息延遲低、社區(qū)活躍、管理界面豐富等特性,使得其在應(yīng)用開發(fā)中越來越受歡迎。8.1.1常用消息中間件3.KafkaKafka是它是一種采用Scala和Java語言編寫的高吞吐量分布式發(fā)布訂閱消息系統(tǒng),提供了快速的、可擴展的、分布式的、分區(qū)的和可復(fù)制的日志訂閱服務(wù),其主要特點是追求高吞吐量,適用于會產(chǎn)生大量數(shù)據(jù)的互聯(lián)網(wǎng)服務(wù)的數(shù)據(jù)收集業(yè)務(wù)。8.1.1常用消息中間件4.RocketMQRocketMQ使用純Java語言編寫,具有高吞吐量、高可用性、適合大規(guī)模分布式系統(tǒng)應(yīng)用的特點。RocketMQ的思路起源于Kafka,對消息的可靠傳輸和事務(wù)性做了優(yōu)化,目前被廣泛應(yīng)用于交易、充值、流計算、消息推送、日志流式處理場景。8.1.2

使用消息服務(wù)的好處先定一個小目標(biāo)!

先定一個小目標(biāo)!熟悉使用消息服務(wù)的好處,能夠通過不同的場景說出使用消息服務(wù)的好處8.1.2

使用消息服務(wù)的好處在多數(shù)應(yīng)用尤其是分布式系統(tǒng)中,消息服務(wù)是不可或缺的重要部分,它使用起來比較簡單,同時解決了不少難題,例如應(yīng)用解耦、異步提速、流量削峰、分布式事務(wù)管理等,使用消息服務(wù)可以實現(xiàn)一個高性能、高可用、高擴展的系統(tǒng)。下面使用實際開發(fā)中的若干場景來分析和說明使用消息服務(wù)的好處。8.1.2

使用消息服務(wù)的好處1.應(yīng)用解耦8.1.2

使用消息服務(wù)的好處2.異步提速8.1.2

使用消息服務(wù)的好處3.流量削峰8.1.2

使用消息服務(wù)的好處4.分布式事務(wù)管理RabbitMQ快速入門8.28.2.1

RabbitMQ簡介先定一個小目標(biāo)!

先定一個小目標(biāo)!了解RabbitMQ簡介,能夠說出RabbitMQ消息代理流程8.2.1

RabbitMQ簡介AMQP是一種與平臺無關(guān)的線路級的消息中間件協(xié)議,其通過制定協(xié)議來統(tǒng)一數(shù)據(jù)交互的格式。AMQP是跨語言的,它只制定協(xié)議,不規(guī)定實現(xiàn)語言和實現(xiàn)方式。RabbitMQ是基于AMQP標(biāo)準(zhǔn),使用Erlang語言開發(fā)的消息中間件,在SpirngBoot中對RabbitMQ進行了集成管理。8.2.1

RabbitMQ簡介在所有的消息服務(wù)中,消息中間件都會作為一個第三方消息代理,接收發(fā)布者發(fā)布的消息,并推送給消息消費者。8.2.1

RabbitMQ簡介Connection:代表客戶端(包括消息生產(chǎn)者和消息消費者)與RabbitMQ之間的連接。Channel:消息通道,位于連接內(nèi)部,負(fù)責(zé)實際的通信。在客戶端的每個連接里,可建立多個Channel。Broker:表示消息隊列服務(wù)器實體,Broker會維護從消息生產(chǎn)者到消息消費者的路線,保證數(shù)據(jù)能按照指定的方式進行傳輸。VirtualHost:虛擬主機,包含交換機、消息隊列等對象。Exchange:交換機,用于接收消息生產(chǎn)者發(fā)送的消息,并根據(jù)分發(fā)規(guī)則將這些消息路由給服務(wù)器中的隊列。Queue:隊列,是消息的載體,每個消息都會被投到一個或多個隊列中,等待消息消費者連接到這個隊列將其取走。Binding:交換機和消息隊列之間的虛擬連接。8.2.1

RabbitMQ簡介RabbitMQ消息代理流程如下。消息生產(chǎn)者(發(fā)送消息的程序)和消息隊列服務(wù)器實體建立連接后,向指定的虛擬主機發(fā)送消息。虛擬主機內(nèi)部的交換機接收消息生產(chǎn)者發(fā)送過來的消息,并將消息傳遞并存儲到與之綁定的消息隊列中。消息消費者(等待接收消息的程序)通過網(wǎng)絡(luò)連接與消息隊列服務(wù)器實體建立連接,在連接內(nèi)部使用消息通道進行消息的最終消費。8.2.2

RabbitMQ工作模式先定一個小目標(biāo)!

先定一個小目標(biāo)!熟悉RabbitMQ工作模式,能夠說出RabbitMQ支持的工作模式,以及每種模式的工作原理8.2.2

RabbitMQ工作模式1.簡單模式RabbitMQ是一個消息代理,它接收和轉(zhuǎn)發(fā)消息,RabbitMQ的簡單模式不用聲明交換機,只需要定義一個隊列,消息生產(chǎn)者會將消息交給默認(rèn)的交換機,默認(rèn)的交換機將獲取到的信息綁定到消息生產(chǎn)者對應(yīng)的隊列,消息消費者監(jiān)聽這個隊列,當(dāng)隊列中有消息時,消息消費者執(zhí)行消息消費。8.2.2

RabbitMQ工作模式2.WorkQueuesWorkQueues模式即工作隊列模式,在WorkQueues模式中,同樣不需要設(shè)置交換機,RabbitMQ會使用內(nèi)部默認(rèn)交換機進行消息轉(zhuǎn)換,只需要指定唯一的消息隊列進行消息傳遞。WorkQueues模式和簡單模式的主要區(qū)別在于,WorkQueues模式可以有多個消息消費者。在這種模式下,多個消息消費者通過輪詢的方式依次接收消息隊列中存儲的消息,一旦消息被某一個消息消費者接收,消息隊列會將消息移除,而接收并處理消息的消費者必須在消費完一條消息后再準(zhǔn)備接收下一條消息。8.2.2

RabbitMQ工作模式3.Publish/SubscribePublish/Subscribe模式即發(fā)布/訂閱模式,在Publish/Subscribe模式中,必須先顯式配置一個fanout類型的交換機,消息生產(chǎn)者將消息發(fā)送到交換機,同時會將消息路由到每一個消息隊列上,然后每個消息隊列都可以對相同的消息進行接收和存儲,進而由各自消息隊列關(guān)聯(lián)的消費者進行消費。8.2.2

RabbitMQ工作模式4.RoutingRouting模式即路由模式,在Routing模式中,必須先配置一個direct類型的交換機,并指定一個RoutingKey。隊列與交換機的綁定也需要指定一個RoutingKey,發(fā)送消息時交換機不再把消息交給每一個綁定的隊列,而是根據(jù)消息的RoutingKey進行判斷,只有隊列的RoutingKey與消息的RoutingKey完全一致時,才會接收到消息,最后由消息消費者進行消費。8.2.2

RabbitMQ工作模式5.Topics(通配符模式)Topics模式即通配符模式,在Topics模式中必須先配置一個topic類型的交換機,并指定不同的Routingkey,根據(jù)Routingkey將對應(yīng)的消息從交換機路由到不同的消息隊列進行存儲,然后由消息消費者進行消費。Topics模式與Routing模式的主要不同在于,Topics模式設(shè)置的路由鍵包含通配符。其中,“#”用于匹配多個字符,“*”用于匹配一個字符,然后與其他字符一起用“.”進行連接。8.2.2

RabbitMQ工作模式6.RPCRPC模式與WorkQueues模式主體流程相似,都不需要設(shè)置交換機,只需要指定唯一的消息隊列進行消息傳遞。RPC模式與WorkQueues模式的主要不同在于,RPC模式是一個回環(huán)結(jié)構(gòu),主要對分布式架構(gòu)的消息傳遞業(yè)務(wù),客戶端(Client)先發(fā)送消息到消息隊列,遠(yuǎn)程服務(wù)端(Server)獲取消息,然后再寫入另一個消息隊列,向原始客戶端(Client)響應(yīng)消息處理結(jié)果。8.2.2

RabbitMQ工作模式7.PublisherConfirmsPublisherConfirms模式即發(fā)布者確認(rèn)模式,是AMQP0.9.1協(xié)議的RabbitMQ擴展,默認(rèn)情況下不啟用,發(fā)布者在通道上啟用發(fā)布者確認(rèn)后,代理將異步確認(rèn)客戶端發(fā)布的消息。PublisherConfirms模式最大的好處在于它是異步的,一旦發(fā)布一條消息,消息生產(chǎn)者就可以在等信道返回確認(rèn)的同時繼續(xù)發(fā)送下一條消息,當(dāng)消息最終得到確認(rèn)之后,消息生產(chǎn)者應(yīng)用便可以通過回調(diào)方法來處理該確認(rèn)消息。8.2.3

RabbitMQ的下載、安裝和配置先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握RabbitMQ的下載、安裝和配置,能夠在Windows平臺安裝和配置RabbitMQ,并成功啟動RabbitMQ8.2.3

RabbitMQ的下載、安裝和配置1.RabbitMQ下載在RabbitMQ官網(wǎng)首頁的GetStarted版塊中單擊“Download+Installation”按鈕進入RabbitMQ的下載頁面。8.2.3

RabbitMQ的下載、安裝和配置1.RabbitMQ下載在RabbitMQ的下載頁面單擊“ChocolateyorInstaller”超鏈接,進入基于Windows平臺的安裝包下載頁面。8.2.3

RabbitMQ的下載、安裝和配置2.RabbitMQ安裝和配置RabbitMQ是使用Erlang語言開發(fā)的,安裝RabbitMQ之前需要先安裝Erlang語言包。RabbitMQ3.11.5需要Erlang的最小版本為25.0,最大版本為25.1。RabbitMQ安裝包和Erlang語言包的安裝都非常簡單,只需要雙擊下載的安裝文件進行安裝,然后“下一步”、“安裝”即可完成,在此就不對安裝過程進行講解。8.2.3

RabbitMQ的下載、安裝和配置2.RabbitMQ安裝和配置完成Erlang和RabbitMQ的安裝后,進一步對RabbitMQ的啟動進行配置,具體步驟如下。(1)配置環(huán)境變量在Path系統(tǒng)變量中添加值“%ERLANG_HOME%\bin;”就可以將Erlang的bin路徑添加到Path系統(tǒng)變量中。為了確保Erlang安裝成功,并且環(huán)境變量設(shè)置成功,在CMD窗口中任意路徑下輸入erl命令進行驗證。8.2.3

RabbitMQ的下載、安裝和配置2.RabbitMQ安裝和配置(2)啟動插件編輯完環(huán)境變量后,在CMD窗口中進入RabbitmQ的sbin目錄,通過命令啟動RabbitMQ的插件。rabbitmq-pluginsenablerabbitmq_management8.2.3

RabbitMQ的下載、安裝和配置2.RabbitMQ安裝和配置(3)啟動RabbitMQ進入RabbitmQ的sbin目錄,雙擊“rabbitmq-server.bat”文件啟動RabbitMQ服務(wù),此時會彈出CMD窗口顯示啟動情況。8.2.3

RabbitMQ的下載、安裝和配置2.RabbitMQ安裝和配置RabbitMQ安裝過程中默認(rèn)提供了用戶名和密碼均為guest的用戶,可以使用該賬戶進行登錄。8.2.4

RabbitMQ入門案例先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握RabbitMQ入門案例,能夠獨立實現(xiàn)RabbitMQ入門案例8.2.4

RabbitMQ入門案例RabbitMQ中提供了queueDeclare()方法用于聲明創(chuàng)建隊列的信息,queueDeclare()方法的具體定義如下。AMQP.Queue.DeclareOkqueueDeclare(Stringqueue,booleandurable,booleanexclusive,booleanautoDelete,Map<String,Object>arguments)throwsIOException;queue:表示隊列名稱。durable:表示是否持久化,如果想重啟之后還存在就要使隊列持久化,需要設(shè)置durable為true。exclusive:表示是否獨占,也就是是否只能有一個消費者監(jiān)聽這隊列,并且當(dāng)Connection關(guān)閉時,是否刪除隊列。autoDelete:表示當(dāng)最后一個消費者斷開連接之后隊列是否自動被刪除。arguments:表示其他參數(shù)。8.2.4

RabbitMQ入門案例RabbitMQ創(chuàng)建隊列后,可以通過basicPublish()方法向RabbitMQ發(fā)送消息,basicPublish()方法的具體定義如下所示。voidbasicPublish(Stringexchange,StringroutingKey,BasicPropertiesprops,byte[]body);exchange:表示交換機名稱,不指定交換機時,RabbitMQ會使用默認(rèn)的交換機。routingKey:表示路由鍵的名稱,交換器根據(jù)消息攜帶的路由鍵,來決定消息交給哪個隊列。props:表示消息的配置屬性。body:表示發(fā)送的消息數(shù)據(jù)。8.2.4

RabbitMQ入門案例1.創(chuàng)建項目在IDEA中創(chuàng)建一個名稱為rabbitmq-simple的Maven項目,并在項目的pom.xml文件中導(dǎo)入RabbitMQ的客戶端依賴和Maven的插件,具體如文件8-1所示。文件8-1pom.xml源代碼8.2.4

RabbitMQ入門案例2.實現(xiàn)消息生產(chǎn)在項目的src/main/java目錄下創(chuàng)建消息生產(chǎn)類Producer_HelloWorld,在該類中的main()方法中編寫生產(chǎn)消息的代碼,具體如8-2所示。文件8-2Producer_HelloWorld.java源代碼8.2.4

RabbitMQ入門案例3.實現(xiàn)消息消費在項目的src/main/java目錄下創(chuàng)建消息消費類Consumer_HelloWorld,在該類中的main()方法中編寫消費消息的代碼,具體如8-3所示。文件8-3Consumer_HelloWorld.java源代碼8.2.4

RabbitMQ入門案例4.效果測試運行文件8-2生產(chǎn)消息,此時,登錄RabbitMQ可視化頁面,查看Queues面板中的內(nèi)容。8.2.4

RabbitMQ入門案例4.效果測試運行文件8-3消費消息,控制臺輸出內(nèi)容。8.2.4

RabbitMQ入門案例4.效果測試此時再次查看RabbitMQ可視化頁面Queues面板中的內(nèi)容。SpringBoot與RabbitMQ整合實現(xiàn)8.38.3

SpringBoot與RabbitMQ整合實現(xiàn)SpringBoot對RabbitMQ支持的6種工作模式都提供了非常好的整合實現(xiàn),并集成了多種方式的整合支持,包括基于API的方式、基于配置類的方式、基于注解的方式。下面選取常用的Publish/Subscribe、Routing和Topics三種工作模式完成在SpringBoot項目中的消息服務(wù)整合實現(xiàn)。8.3.1

SpringBoot整合RabbitMQ環(huán)境搭建先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握SpringBoot整合RabbitMQ環(huán)境搭建,能夠在SpringBoot項目中整合RabbitMQ8.3.1

SpringBoot整合RabbitMQ環(huán)境搭建1.創(chuàng)建SpringBoot項目使用SpringInitializr方式創(chuàng)建一個名稱為rabbitmq的SpringBoot項目。在Dependencies依賴選擇中選擇Web模塊中的SpringWeb依賴,以及Integration模塊中的RabbitMQ依賴。8.3.1

SpringBoot整合RabbitMQ環(huán)境搭建2.編寫配置文件打開創(chuàng)建項目時自動生成的perties全局配置文件,在該文件中編寫RabbitMQ服務(wù)對應(yīng)的連接配置,具體如文件8-4所示。文件8-4perties源代碼8.3.1

SpringBoot整合RabbitMQ環(huán)境搭建需要強調(diào)的是,在上述項目全局配置文件perties中,編寫了外部RabbitMQ消息中間件的連接配置,這樣在整合消息服務(wù)時,使用的都是自己安裝配置的RabbitMQ服務(wù)。而在SpringBoot中,也集成了一個內(nèi)部默認(rèn)的RabbitMQ中間件,如果沒有在配置文件中配置外部RabbitMQ連接,會啟用內(nèi)部的RabbitMQ中間件,通常建議讀者根據(jù)當(dāng)前RabbitMQ的情況自行設(shè)置配置信息。小提示8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握使用Publish/Subscribe模式實現(xiàn)消息服務(wù),能夠在SpringBoot項目中使用Publish/Subscribe模式實現(xiàn)消息服務(wù)8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)SpringBoot整合RabbitMQ中間件實現(xiàn)消息服務(wù),主要圍繞三個部分的工作來開展,即定制中間件、消息生成者發(fā)送消息、消息消費者接收消息。下面以用戶注冊成功后同時發(fā)送郵件通知和短信通知這一場景為例,分別使用基于API、基于配置類和基于注解這三種方式實現(xiàn)Publish/Subscribe模式的消息服務(wù)。8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(1)定制消息組件在rabbitmq項目中創(chuàng)建名為com.itheima.rabbitmq.service的包,在包中創(chuàng)建消息生產(chǎn)服務(wù)類MessageProducerService,在該類的構(gòu)造方法中使用AmqpAdmin管理類定制Publish/Subscribe模式所需的組件,具體如文件8-5所示。1.基于API的方式文件8-5MessageProducerService.java源代碼8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(2)實現(xiàn)消息生產(chǎn)①創(chuàng)建實體類。完成消息組件的定制工作后,創(chuàng)建消息生產(chǎn)者并發(fā)送消息到消息隊列中。在發(fā)送消息時,通常會將消息封裝在類中進行傳遞,在此,在rabbitmq項目中創(chuàng)建名為com.itheima.rabbitmq.domain的包,并在該包下創(chuàng)建一個用戶User,具體如文件8-6所示。1.基于API的方式文件8-6User.java源代碼8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(2)實現(xiàn)消息生產(chǎn)②創(chuàng)建生產(chǎn)消息的方法。在文件8-5中新增發(fā)送消息的方法psubPublisher(),該方法中使用RabbitTemplate對象發(fā)送消息。1.基于API的方式MessageProducerService.java源代碼8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(2)實現(xiàn)消息生產(chǎn)③創(chuàng)建控制器。在rabbitmq項目中創(chuàng)建名為com.itheima.rabbitmq.controller的包,并在該包下創(chuàng)建一個控制器類,在該類中定義方法調(diào)用生產(chǎn)消息的方法,具體如文件8-7所示。1.基于API的方式文件8-7UserController.java源代碼8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(2)實現(xiàn)消息生產(chǎn)④指定消息轉(zhuǎn)換器。在rabbitmq項目中創(chuàng)建名為com.itheima.rabbitmq.config的包,并在該包下創(chuàng)建一個RabbitMQ消息配置類RabbitMQConfig,具體如文件8-8所示。1.基于API的方式文件8-8RabbitMQConfig.java源代碼8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(3)實現(xiàn)消息消費在rabbitmq項目的com.itheima.rabbitmq.service包下創(chuàng)建一個對RabbitMQ消息中間件進行消息接收和處理的服務(wù)類MessageConsumerService,在該類中實現(xiàn)消息的消費,具體如文件8-9所示。1.基于API的方式文件8-9MessageConsumerService.java源代碼8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(4)測試效果為了能更好地觀察消息的生產(chǎn)和消費情況,在文件8-9的第11行代碼和第21行代碼打上斷點,并以Debug模式啟動項目。項目啟動成功后,通過RabbitMQ可視化管理頁面查看Queues面板。1.基于API的方式8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(4)測試效果查看Exchanges面板。1.基于API的方式8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(4)測試效果單擊“pub/sub.exchange”進入Exchanges面板查看交換機詳情。1.基于API的方式8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(4)測試效果瀏覽器中訪問“http://localhost:8080/user/1/zhangsan”,此時會觸發(fā)生產(chǎn)消息的操作。再次查看Queues面板。1.基于API的方式8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(4)測試效果對斷點進行放行后,IDEA控制臺輸出消息。1.基于API的方式8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(4)測試效果再次查看Queues面板。1.基于API的方式8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(1)定制消息組件在文件8-8的RabbitMQ消息配置類RabbitMQConfig中,定制消息組件交由Spring進行管理,修改后的內(nèi)容如文件8-10所示。2.基于配置類的方式文件8-10RabbitMQConfig.java源代碼8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(2)修改消息生產(chǎn)服務(wù)類基于API的方式中已經(jīng)實現(xiàn)了消息生產(chǎn)者和消息消費者。為了驗證消息組件是由消息配置類中實現(xiàn)的,將文件8-5中制定消息組件的構(gòu)造器進行刪除或注釋,并注入RabbitTemplate對象即可。具體如文件8-11所示。2.基于配置類的方式文件8-11MessageProducerService.java源代碼8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(3)效果測試重新啟動項目,在瀏覽器中發(fā)送請求觸發(fā)消息生產(chǎn)的操作,消息消費者可以自動監(jiān)聽并消費消息隊列中存在的消息,測試效果與基于API的方式一樣。2.基于配置類的方式8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(1)定制消息組件在文件8-10中取消在配置類中定義交換機、隊列和這兩者之間的綁定。在文件8-9的消息消費服務(wù)類MessageConsumerService的郵件業(yè)務(wù)和短信業(yè)務(wù)處理的消息消費方法上,使用@RabbitListener注解及其相關(guān)屬性定制消息組件,并消費消息,修改后的內(nèi)容如文件8-12所示。3.基于注解的方式文件8-12MessageConsumerService.java源代碼8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)(2)效果測試重新啟動項目,在瀏覽器中發(fā)送請求觸發(fā)消息生產(chǎn)的操作,消息消費者可以自動監(jiān)聽并消費消息隊列中存在的消息,測試效果也與基于API的方式一樣。3.基于注解的方式8.3.2

使用Publish/Subscribe模式實現(xiàn)消息服務(wù)SpringBoot中基于API、基于配置類和基于注解這三種方式來實現(xiàn)Publish/Subscribe工作模式的整合的不同之處?;贏PI的方式:相對簡單、直觀,但容易與業(yè)務(wù)代碼產(chǎn)生耦合;基于配置類的方式:組件和業(yè)務(wù)相對隔離、容易統(tǒng)一管理、符合SpringBoot框架思想;基于注解的方式:清晰明了、方便各自管理,但是也容易與業(yè)務(wù)代碼產(chǎn)生耦合。在實際開發(fā)中,使用基于配置類的方式和基于注解的方式定制組件實現(xiàn)消息服務(wù)較為常見,使用基于API的方式偶爾使用,具體選擇的話需要根據(jù)實際情況進行選擇。8.3.3

使用Routing模式實現(xiàn)消息服務(wù)先定一個小目標(biāo)!

先定一個小目標(biāo)!掌握使用Routing模式實現(xiàn)消息服務(wù),能夠在SpringBoot項目中使用Routing模式實現(xiàn)消息服務(wù)8.3.3

使用Routing模式實現(xiàn)消息服務(wù)在文件8-11的MessageProducerService類中新增生產(chǎn)消息的方法routingPublisher(),在該方法中使用RabbitTemplate模板類實現(xiàn)Routing路由模式下的消息發(fā)送。1.實現(xiàn)消息生產(chǎn)MessageProducerService.java源代碼下面以不同級別的日志信息采集處理為例,在SpringBoot項目中使用基于注解的方式使用Routing模式實現(xiàn)消息服務(wù)。8.3.3

使用Routing模式實現(xiàn)消息服務(wù)在文件8-7的UserController類中新增方法routingPublisher()用于觸發(fā)消息生產(chǎn),本案例指定傳入的日志信息的格式為“日志信息級別&日志信息內(nèi)容”。1.實現(xiàn)消息生產(chǎn)UserController.java源代碼8.3.3

使用Routing模式實現(xiàn)消息服務(wù)在文件8-12的MessageConsumerService類中新增消費消息的方法,消費消息的方法使用@RabbitListener注解進行標(biāo)注。2.實現(xiàn)消息消費MessageConsumerService.java源代碼8.3.3

使用Routing模式實現(xiàn)消息服務(wù)啟動項目后,RabbitMQ會根據(jù)文件8-12中@RabbitListener注解的信息創(chuàng)建對應(yīng)的交換機、隊列,以及交換機和隊列的綁定關(guān)系。通過RabbitMQ可視化管理頁面查看routing.exchange交換機的詳細(xì)信息。3.測試效果8.3.3

使用Routing模式實現(xiàn)消息服務(wù)測試發(fā)送error級別的日志信息。在瀏覽器中訪問“http://localhost:8080/user/error&OutOfMemory”,控制臺輸出消息。3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論