最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java消息隊列JMS實現(xiàn)原理解析

 更新時間:2020年03月24日 11:50:44   作者:平凡希  
這篇文章主要介紹了Java消息隊列JMS實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

一、什么是JMS

JMS即Java消息服務(Java Message Service)應用程序接口,是一個Java平臺中關于面向消息中間件(MOM)的API,用于在兩個應用程序之間,或分布式系統(tǒng)中發(fā)送消息,進行異步通信。Java消息服務是一個與具體平臺無關的API,絕大多數(shù)MOM提供商都對JMS提供支持(百度百科給出的概述)。我們可以簡單的理解:兩個應用程序之間需要進行通信,我們使用一個JMS服務,進行中間的轉發(fā),通過JMS 的使用,我們可以解除兩個程序之間的耦合。

二、為什么需要JMS

在JAVA中,如果兩個應用程序之間對各自都不了解,甚至這兩個程序可能部署在不同的大洲上,那么它們之間如何發(fā)送消息呢?舉個例子,一個應用程序A部署在印度,另一個應用程序部署在美國,然后每當A觸發(fā)某件事后,B想從A獲取一些更新信息。當然,也有可能不止一個B對A的更新信息感興趣,可能會有N個類似B的應用程序想從A中獲取更新的信息。

  在這種情況下,JAVA提供了最佳的解決方案-JMS,完美解決了上面討論的問題。

  JMS同樣適用于基于事件的應用程序,如聊天服務,它需要一種發(fā)布事件機制向所有與服務器連接的客戶端發(fā)送消息。JMS與RMI不同,發(fā)送消息的時候,接收者不需要在線。服務器發(fā)送了消息,然后就不管了;等到客戶端上線的時候,能保證接收到服務器發(fā)送的消息。這是一個很強大的解決方案,能處理當今世界很多普遍問題。

三、JMS的優(yōu)勢

1、異步

JMS天生就是異步的,客戶端獲取消息的時候,不需要主動發(fā)送請求,消息會自動發(fā)送給可用的客戶端。

2、可靠

JMS保證消息只會遞送一次。大家都遇到過重復創(chuàng)建消息問題,而JMS能幫你避免該問題。

四、JMS的消息模型

JMS具有兩種通信模式:

1、Point-to-Point Messaging Domain (點對點)

2、Publish/Subscribe Messaging Domain (發(fā)布/訂閱模式)

在JMS API出現(xiàn)之前,大部分產品使用“點對點”和“發(fā)布/訂閱”中的任一方式來進行消息通訊。JMS定義了這兩種消息發(fā)送模型的規(guī)范,它們相互獨立。任何JMS的提供者可以實現(xiàn)其中的一種或兩種模型,這是它們自己的選擇。JMS規(guī)范提供了通用接口保證我們基于JMS API編寫的程序適用于任何一種模型。

1、Point-to-Point Messaging Domain(點對點通信模型)

點對點的模式主要建立在一個隊列上面,當連接一個列隊的時候,發(fā)送端不需要知道接收端是否正在接收,可以直接向ActiveMQ發(fā)送消息,發(fā)送的消息,將會先進入隊列中,如果有接收端在監(jiān)聽,則會發(fā)向接收端,如果沒有接收端接收,則會保存在activemq服務器,直到接收端接收消息,點對點的消息模式可以有多個發(fā)送端,多個接收端,但是一條消息,只會被一個接收端給接收到,哪個接收端先連上ActiveMQ,則會先接收到,而后來的接收端則接收不到那條消息。

在點對點消息傳送模型中,應用程序由消息隊列,發(fā)送者,接收者組成。每一個消息發(fā)送給一個特殊的消息隊列,該隊列保存了所有發(fā)送給它的消息(除了被接收者消費掉的和過期的消息)。

(1)模式圖:

(2)特點:

每個消息只有一個消費者;

發(fā)送者和接收者在時間上是沒有時間的約束,也就是說發(fā)送者在發(fā)送完消息之后,不管接收者有沒有接受消息,都不會影響發(fā)送方發(fā)送消息到消息隊列中;

發(fā)送方不管是否在發(fā)送消息,接收方都可以從消息隊列中取到消息;

接收方在接收完消息之后,需要向消息隊列應答成功。

2、Publish/Subscribe Messaging Domain(發(fā)布/訂閱通信模型)

訂閱/發(fā)布模式,同樣可以有著多個發(fā)送端與多個接收端,但是接收端與發(fā)送端存在時間上的依賴,就是如果發(fā)送端發(fā)送消息的時候,接收端并沒有監(jiān)聽消息,那么ActiveMQ將不會保存消息,將會認為消息已經發(fā)送,換一種說法,就是發(fā)送端發(fā)送消息的時候,接收端不在線,是接收不到消息的,哪怕以后監(jiān)聽消息,同樣也是接收不到的。這個模式還有一個特點,那就是,發(fā)送端發(fā)送的消息,將會被所有的接收端給接收到,不類似點對點,一條消息只會被一個接收端給接收到。

在發(fā)布/訂閱消息模型中,發(fā)布者發(fā)布一個消息,該消息通過topic傳遞給所有的客戶端。該模式下,發(fā)布者與訂閱者都是匿名的,即發(fā)布者與訂閱者都不知道對方是誰。并且可以動態(tài)的發(fā)布與訂閱Topic。Topic主要用于保存和傳遞消息,且會一直保存消息直到消息被傳遞給客戶端。

(1)模式圖:

(2)特點:

一個消息可以傳遞個多個訂閱者(即:一個消息可以有多個接收方);

發(fā)布者與訂閱者具有時間約束,針對某個主題(Topic)的訂閱者,它必須創(chuàng)建一個訂閱者之后,才能消費發(fā)布者的消息,而且為了消費消息,訂閱者必須保持運行的狀態(tài);

為了緩和這樣嚴格的時間相關性,JMS允許訂閱者創(chuàng)建一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運行),它也能接收到發(fā)布者的消息。

五、JMS接收消息

在JMS中,消息的接收可以使用以下兩種方式:

(1)同步

使用同步方式接收消息的話,消息訂閱者調用receive()方法。在receive()中,消息未到達或在到達指定時間之前,方法會阻塞,直到消息可用。

(2)異步

使用異步方式接收消息的話,消息訂閱者需注冊一個消息監(jiān)聽者,類似于事件監(jiān)聽器,只要消息到達,JMS服務提供者會通過調用監(jiān)聽器的onMessage()遞送消息。

六、JMS編程模型

(1)管理對象(Administered objects)-連接工廠(Connection Factories)和目的地(Destination)

(2)連接對象(Connections)

(3)會話(Sessions)

(4)消息生產者(Message Producers)

(5)消息消費者(Message Consumers)

(6)消息監(jiān)聽者(Message Listeners)

(1)JMS管理對象

管理對象(Administered objects)是預先配置的JMS對象,由系統(tǒng)管理員為使用JMS的客戶端創(chuàng)建,主要有兩個被管理的對象:

連接工廠(ConnectionFactory)目的地(Destination)

這兩個管理對象由JMS系統(tǒng)管理員通過使用Application Server管理控制臺創(chuàng)建,存儲在應用程序服務器的JNDI名字空間或JNDI注冊表。

① 連接工廠(ConnectionFactory)

創(chuàng)建Connection對象的工廠,針對兩種不同的jms消息模型,分別有QueueConnectionFactory和TopicConnectionFactory兩種??梢酝ㄟ^JNDI來查找ConnectionFactory對象。客戶端使用一個連接工廠對象連接到JMS服務提供者,它創(chuàng)建了JMS服務提供者和客戶端之間的連接。JMS客戶端(如發(fā)送者或接受者)會在JNDI名字空間中搜索并獲取該連接。使用該連接,客戶端能夠與目的地通訊,往隊列或話題發(fā)送/接收消息。讓我們用一個例子來理解如何發(fā)送消息:

QueueConnectionFactory queueConnFactory = (QueueConnectionFactory) initialCtx.lookup ("primaryQCF");
Queue purchaseQueue = (Queue) initialCtx.lookup ("Purchase_Queue");
Queue returnQueue = (Queue) initialCtx.lookup ("Return_Queue");

② 目的地(Destination)

目的地指明消息被發(fā)送的目的地以及客戶端接收消息的來源。JMS使用兩種目的地,隊列和話題。如下代碼指定了一個隊列和話題。

創(chuàng)建一個隊列Session

QueueSession ses = con.createQueueSession (false, Session.AUTO_ACKNOWLEDGE); //get the Queue object
Queue t = (Queue) ctx.lookup ("myQueue"); //create QueueReceiver
QueueReceiver receiver = ses.createReceiver(t);

創(chuàng)建一個話題

TopicSession ses = con.createTopicSession (false, Session.AUTO_ACKNOWLEDGE); // get the Topic object
Topic t = (Topic) ctx.lookup ("myTopic"); //create TopicSubscriber
TopicSubscriber receiver = ses.createSubscriber(t);

(2)JMS連接對象(Connection)

Connection表示在客戶端和JMS系統(tǒng)之間建立的連接(對TCP/IP socket的包裝)。Connection可以產生一個或多個Session。跟ConnectionFactory一樣,Connection也有兩種類型:QueueConnection和TopicConnection。

連接對象封裝了與JMS提供者之間的虛擬連接,如果我們有一個ConnectionFactory對象,可以使用它來創(chuàng)建一個連接。

Connection connection = connectionFactory.createConnection();

創(chuàng)建完連接后,需要在程序使用結束后關閉它:connection.close();

(3)JMS會話(Session)

Session 是我們對消息進行操作的接口,可以通過session創(chuàng)建生產者、消費者、消息等。Session 提供了事務的功能,如果需要使用session發(fā)送/接收多個消息時,可以將這些發(fā)送/接收動作放到一個事務中。

我們可以在連接創(chuàng)建完成之后創(chuàng)建session:

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

這里面提供了參數(shù)兩個參數(shù),第一個參數(shù)是是否支持事務,第二個是事務的類型。

(4)JMS消息生產者(Producer)

消息生產者由Session創(chuàng)建,用于往目的地發(fā)送消息。生產者實現(xiàn)MessageProducer接口,我們可以為目的地、隊列或話題創(chuàng)建生產者。

MessageProducer producer = session.createProducer(dest);
MessageProducer producer = session.createProducer(queue);
MessageProducer producer = session.createProducer(topic);

創(chuàng)建完消息生產者后,可以使用send方法發(fā)送消息:

復制代碼 代碼如下:
producer.send(message);

(5)JMS消息消費者(Consumer)

消息消費者由Session創(chuàng)建,用于接收被發(fā)送到Destination的消息。消費者實現(xiàn)MessageConsumer接口,我們可以為目的地、隊列或話題創(chuàng)建消費者。

MessageConsumer consumer = session.createConsumer(dest);MessageConsumer consumer = session.createConsumer(queue);MessageConsumer consumer = session.createConsumer(topic);

(6)JMS消息監(jiān)聽器

JMS消息監(jiān)聽器是消息的默認事件處理者,他實現(xiàn)了MessageListener接口,該接口包含一個onMessage方法,在該方法中需要定義消息達到后的具體動作。通過調用setMessageListener方法,我們給指定的消費者定義了消息監(jiān)聽器。

Listener myListener = new Listener();consumer.setMessageListener(myListener);

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Spring?Boot項目集成Knife4j接口文檔的實例代碼

    Spring?Boot項目集成Knife4j接口文檔的實例代碼

    Knife4j就相當于是swagger的升級版,對于我來說,它比swagger要好用得多<BR>,這篇文章主要介紹了Spring?Boot項目集成Knife4j接口文檔的示例代碼,需要的朋友可以參考下
    2021-12-12
  • 詳解SpringBoot中關于%2e的Trick

    詳解SpringBoot中關于%2e的Trick

    這篇文章主要介紹了SpringBoot中關于%2e的Trick,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • java、python、JavaScript以及jquery循環(huán)語句的區(qū)別

    java、python、JavaScript以及jquery循環(huán)語句的區(qū)別

    本篇文章主要介紹java、python、JavaScript以及jquery的循環(huán)語句的區(qū)別,這里整理了它們循環(huán)語句語法跟示例,以便大家閱讀,更好的區(qū)分它們的不同
    2016-07-07
  • SpringBoot?@Configuration與@Bean注解使用介紹

    SpringBoot?@Configuration與@Bean注解使用介紹

    這篇文章主要介紹了SpringBoot中的@Configuration與@Bean注解,在進行項目編寫前,我們還需要知道一個東西,就是SpringBoot對我們的SpringMVC還做了哪些配置,包括如何擴展,如何定制,只有把這些都搞清楚了,我們在之后使用才會更加得心應手
    2022-10-10
  • Spring的初始化和XML解析的實現(xiàn)

    Spring的初始化和XML解析的實現(xiàn)

    這篇文章主要介紹了Spring的初始化和XML解析的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • MybatisPlus的IPage失效的問題解決方案

    MybatisPlus的IPage失效的問題解決方案

    這篇文章主要介紹了MybatisPlus的IPage失效的問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • springboot + mybatis-plus實現(xiàn)多表聯(lián)合查詢功能(注解方式)

    springboot + mybatis-plus實現(xiàn)多表聯(lián)合查詢功能(注解方式)

    這篇文章主要介紹了springboot + mybatis-plus實現(xiàn)多表聯(lián)合查詢功能,是最簡單的一種注解方式,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot?啟動流程追蹤方法分享

    SpringBoot?啟動流程追蹤方法分享

    這篇文章主要介紹了SpringBoot?啟動流程追蹤方法分享的相關資料,需要的朋友可以參考下
    2023-08-08
  • [Spring MVC] -簡單表單提交實例

    [Spring MVC] -簡單表單提交實例

    本篇文章主要介紹了[Spring MVC] -簡單表單提交實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。
    2016-12-12
  • 通過java.util.TreeMap源碼加強紅黑樹的理解

    通過java.util.TreeMap源碼加強紅黑樹的理解

    通過分析java.util.TreeMap源碼來對經典問題紅黑樹加強理解和理清思路。
    2017-11-11

最新評論

常州市| 潼关县| 郴州市| 湘西| 澄迈县| 孟连| 灵武市| 山丹县| 江北区| 肥西县| 杭锦后旗| 民权县| 阳西县| 临西县| 安仁县| 桃源县| 彩票| 陈巴尔虎旗| 宜君县| 西充县| 汽车| 宣恩县| 中江县| 高青县| 伊金霍洛旗| 陕西省| 堆龙德庆县| 建水县| 汝南县| 小金县| 剑川县| 商河县| 壤塘县| 鄂托克前旗| 韩城市| 江门市| 昔阳县| 利川市| 黄平县| 罗源县| 久治县|