02 JMS(Java Messaging Service)

1 JMS規(guī)范

1.1 JMS介紹:

Java消息服務(wù)(Java Message Server) 及JMS,是一個(gè)Java平臺(tái)中關(guān)于面向消息中間件的API,用于在兩個(gè)應(yīng)用程序之間或分布式系統(tǒng)中發(fā)送消息,進(jìn)行異步通信。(總結(jié),就是Java中關(guān)于消息中間件的一個(gè)API規(guī)范)。

1.2 JSM的定義:

JavaAPI。不支持跨語言,并提供了兩種消息模型(p2p、pub/sub),有如下消息類型(TextMessage、MapMessage、ByteMessage、StreamMessage、ObjectMessage、Message)。綜合評(píng)價(jià),JMS定義了Java API層面的標(biāo)準(zhǔn),在Java體系中多個(gè)client均可以通過JMS進(jìn)行交互,不需要應(yīng)用修改代碼。

1.3 JMS相關(guān)概念:

提供者:實(shí)現(xiàn)JMS規(guī)范的消息中間件服務(wù)器
客戶端:接受或發(fā)送消息的應(yīng)用程序
生產(chǎn)者/發(fā)布者:創(chuàng)建并發(fā)送消息的客戶端
消費(fèi)者/訂閱者:接收并處理消息的客戶端
消息:應(yīng)用程序之間傳遞的數(shù)據(jù)內(nèi)容
消息模式:在客戶端之間傳遞消息的方式,JMS中定義了主題和隊(duì)列兩種模式

1.4 JMS規(guī)范中的消息

JMS 消息由以下三部分組成:
消息頭: 每個(gè)消息頭字段都有相應(yīng)的getter 和setter 方法。
消息屬性:如果需要除消息頭字段以外的值,那么可以使用消息屬性。
消息體:JMS 定義的消息類型有TextMessage、MapMessage、BytesMessage、
StreamMessage 和 ObjectMessage。ActiveMQ也有對(duì)應(yīng)的實(shí)現(xiàn)。

1.5 JMS消息模式:

1、隊(duì)列模型(也稱為 Point-to-Point(P2P) / 點(diǎn)對(duì)點(diǎn)):

  • 消息通過稱為隊(duì)列的一個(gè)虛擬通道來進(jìn)行交換。隊(duì)列是生產(chǎn)者發(fā)送消息的目的地和接受者消費(fèi)消息的消息源。
  • 每條消息通僅會(huì)傳送給一個(gè)接受者??赡軙?huì)有多個(gè)接受者在一個(gè)隊(duì)列中偵聽,但是每個(gè)隊(duì)列中的消息只能被隊(duì)列中的一個(gè)接受者消費(fèi)。
  • 消息存在先后順序。一個(gè)隊(duì)列會(huì)按照消息服務(wù)器將消息放入隊(duì)列中的順序,把它們傳送給消費(fèi)者當(dāng)消息已被消費(fèi)時(shí),就會(huì)從隊(duì)列頭部將它們刪除。
  • 每個(gè)消息只有一個(gè)消費(fèi)者(Consumer)(即一旦被消費(fèi),消息就不再在消息隊(duì)列中)
  • 發(fā)送者發(fā)送了消息之后,不管接收者有沒有正在運(yùn)行,它不會(huì)影響到消息被發(fā)送到隊(duì)列
  • 接收者在成功接收消息之后需向隊(duì)列應(yīng)答成功
  • 如果希望發(fā)送的每個(gè)消息都應(yīng)該被成功處理的話,使用這個(gè)P2P模式。

圖片.png

2、Topic/ 主題(發(fā)布訂閱(Pub/Sub) )

  • 消息生產(chǎn)者(發(fā)布)將消息發(fā)布到topic中,同時(shí)有多個(gè)消息消費(fèi)者(訂閱)消費(fèi)該消息。和點(diǎn)對(duì)點(diǎn)方式不同,發(fā)布到topic的消息會(huì)被所有訂閱者消費(fèi)。
  • 如果你希望發(fā)送的消息可以不被做任何處理、或者被一個(gè)消息者處理、或者可以被多個(gè)消費(fèi)者處理的話,那么可以采用topic模型


    圖片.png

1.6 JMS規(guī)范:

ConnectionFactory 連接工廠,用于創(chuàng)建連接到消息中間件的連接工廠
Connection JMS連接,代表了應(yīng)用程序與消息服務(wù)器之間的通信鏈路(一個(gè)連接可以創(chuàng)建多個(gè)會(huì)話)
Destination JMS目的/ Broker,只消息發(fā)布和接受的地點(diǎn),包括隊(duì)列或主題
Session JMS會(huì)話,表示一個(gè)單線程的上下文,用于發(fā)送和接受消息(所有會(huì)話都在一個(gè)線程中)
MessageConsumer JMS消費(fèi)者,由會(huì)話創(chuàng)建,用于接受發(fā)送到目標(biāo)的消息
MessageProducer JMS生產(chǎn)者,由會(huì)話創(chuàng)建,用于發(fā)送消息到目標(biāo)
Message JMS消息,由會(huì)話創(chuàng)建,是生成者/發(fā)布者和消費(fèi)者/訂閱者之間傳送的對(duì)象,包括一個(gè)消息頭,一組消息屬性、一個(gè)消息體

圖片.png

1.7 Spring集成JMS:

spring封裝jms提供的接口:

  • ConnectionFactory 用于管理連接的連接工廠(注:是Spring提供的),是一個(gè)是Spring提供的連接池,因?yàn)?Jms每次發(fā)送消息都會(huì)重新創(chuàng)建連接、會(huì)話和producer(生產(chǎn)者),Spring中提供了兩種連接池SingleConnectionFactory和CachingConnectionFactory。其中SingleConnectionFactory在整個(gè)應(yīng)用中所有jsm會(huì)話都是使用同一個(gè)Connertion連接來操作,而CachingConnectionFactory繼承自SingleConnectionFactory,擁有SingleConnectionFactory的所有功能,并提供了緩存功能,可以緩存session(會(huì)話)、producer(生產(chǎn)者/發(fā)布者)、consumer(消費(fèi)者/訂閱者)

  • JmsTemplate 用于發(fā)送和接收消息的模板類,是Spring提供的,只需要向Spring容器注冊(cè)這個(gè)類就可以使用JmsTemplate方面的操作jms,JmsTemplate類是線程安全的,可以在整個(gè)應(yīng)用范圍使用(注:可以創(chuàng)建多個(gè)JmsTemplate)

  • MessageListerner 消息監(jiān)聽器,只需要實(shí)現(xiàn)一個(gè)onMessage方法,給方法只接受一個(gè)Message參數(shù),就可以實(shí)現(xiàn)對(duì)消息的操作了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容