posts - 12, comments - 19, trackbacks - 0, articles - 23
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          JMS(Java消息服務(wù))是一個(gè)消息交換標(biāo)準(zhǔn),它允許使用J2EE應(yīng)用程序組件建立、發(fā)送、接收和讀取消息。它假設(shè)分布式通訊擁有自由(free)的連接、是可靠的(reliable)和異步的(asynchronous)。

            Exchange(交換)系統(tǒng)

            消息交換反映了程序組件或應(yīng)用程序之間的一種交互作用。消息交換系統(tǒng)是一種類似于下的系統(tǒng):一個(gè)相似系統(tǒng)的客戶端可以發(fā)送和接收任何其它客戶端的消息。每個(gè)客戶端都并入系統(tǒng)的代理中,它提供了建立、發(fā)送、接收和讀取消息的可能。

            交換系統(tǒng)使得分布式的交互操作成為可能。組件在目的地(Destination)發(fā)送消息,收件人也可以在相同的目的地中得到這個(gè)消息。發(fā)送者和收件人不一定是互相熟悉的。換句話說,它并沒有強(qiáng)迫發(fā)送者知道一些收件人的信息,也沒有強(qiáng)迫收件人知道某些發(fā)送者的信息。發(fā)送者和收件人只需要知道消息的格式以及要到達(dá)的目的地。在這種情形下,上述的系統(tǒng)不同于與它緊密相連的一些技術(shù),例如遠(yuǎn)程方法調(diào)用(RMI),它只要求開發(fā)人員了解RMI中的一些方法。

            消息傳遞系統(tǒng)

            消息傳遞系統(tǒng)是一種分布式的系統(tǒng),是基于系統(tǒng)組件之間的異步消息交換。面向消息的中間件(Message-Oriented Middleware,MOM)就是這種產(chǎn)品,消息傳遞系統(tǒng)是在它的原理上建立的。

            消息傳遞系統(tǒng)應(yīng)用軟件不會(huì)直接地通訊(這與傳統(tǒng)的系統(tǒng)(基于RMI的)形成鮮明的對(duì)照),而需要依賴MOM的幫助。如果系統(tǒng)的某個(gè)組件希望給另一個(gè)組件發(fā)送消息,它將把給定的消息發(fā)送給MOM,接著MOM把該消息發(fā)送給收件人。


            與傳統(tǒng)的基于RMI構(gòu)建的系統(tǒng)相比,它有以下優(yōu)點(diǎn):

            · 發(fā)送消息的應(yīng)用程序不需要期待回應(yīng),可以繼續(xù)執(zhí)行。

            · 沒有強(qiáng)迫發(fā)送消息的應(yīng)用程序和特定消息的收件人在某個(gè)特定的時(shí)刻是激活的。如果消息的收件人不是激活的,MOM保證收件人一旦激活就立即收到該消息。

            · 系統(tǒng)組件沒有直接地彼此相連。它們被分離開了,這就是在運(yùn)行時(shí)刻能把組件從一個(gè)主機(jī)傳輸?shù)搅硪粋€(gè)、卻不會(huì)中斷系統(tǒng)可用性的原因。

            消息交換模型:點(diǎn)對(duì)點(diǎn)模型和發(fā)表-預(yù)訂模型

            目前有兩種“基本的”消息交換模型:點(diǎn)對(duì)點(diǎn)模型和發(fā)表-預(yù)訂(pub-sub)模型。點(diǎn)對(duì)點(diǎn)模型應(yīng)用于一個(gè)或多個(gè)組件(發(fā)送者)僅僅給一個(gè)組件收件人(接收者)發(fā)送消息的情形。這種模型是基于消息隊(duì)列概念的:發(fā)送者把消息發(fā)送到隊(duì)列中,接收者從該隊(duì)列中讀取消息。在點(diǎn)對(duì)點(diǎn)模型中,相同的隊(duì)列上可能存在多個(gè)接收者,但是MOM只給其中一個(gè)傳遞消息。給哪一個(gè)傳遞消息依賴于MOM的實(shí)現(xiàn)(implementation)。

            發(fā)表-預(yù)訂模型應(yīng)用于一個(gè)或多個(gè)組件(發(fā)表者)給一個(gè)或多個(gè)組件收件人(預(yù)訂者)發(fā)送消息的情形。這種特定的模型是基于消息主題(message topic)概念的:發(fā)表者把消息發(fā)送到某個(gè)主題中,而該特定主題的預(yù)訂者接收這些消息。

            發(fā)表-預(yù)訂模型看起來更加“優(yōu)雅”,但是很多發(fā)表-預(yù)訂模型不能保證消息按照發(fā)送的次序傳遞(它與點(diǎn)對(duì)點(diǎn)模型相反,點(diǎn)對(duì)點(diǎn)隊(duì)列實(shí)現(xiàn)了FIFO(先進(jìn)先出)原理)。因此,消息的次序很重要(或者為了同步需要使用消息的頭和屬性部分)的時(shí)候,就應(yīng)該避免采用發(fā)表-預(yù)訂模型。

            Java消息服務(wù)(JMS)是使用面向消息中間件的一套Java API,它允許你的應(yīng)用程序建立、發(fā)送、接收和讀取消息。這組程序集位于J2EE程序包結(jié)構(gòu)樹上的javax.jms程序包中。JMS在很多MOM產(chǎn)品中得到了實(shí)現(xiàn),其中iPlanet Message Queue、 IBM MQSeries、Progress Software SonicMQ、BEA WebLogic Server、Prism Technologies OpenFusion等最有名氣,也存在一些免費(fèi)的實(shí)現(xiàn)。

            JMS同時(shí)支持消息交換的兩種“基本的”模型。但是,其說明(specification)并沒有要求廠商同時(shí)實(shí)現(xiàn)兩種模型,盡管大多數(shù)JMS產(chǎn)品實(shí)現(xiàn)了點(diǎn)對(duì)點(diǎn)和發(fā)表-預(yù)訂模型。

            JMS應(yīng)用程序

            JMS應(yīng)用程序的主要部分是:

            · 產(chǎn)生連接的部分和目的地

            · 連接

            · 對(duì)話

            · 產(chǎn)生消息的部分

            · 使用消息的部分

            · 消息

            產(chǎn)生連接的部分(ConnectionFactory)是負(fù)責(zé)建立JMS連接的對(duì)象。每個(gè)ConnectionFactory都是QueueConnectionFactory或TopicConnectionFactory的一個(gè)副本(copy)。MOM管理器建立特定的對(duì)象,并把它與JNDI樹關(guān)聯(lián)起來,這樣JMS客戶端就能夠使用標(biāo)準(zhǔn)的JNDI查找表得到ConnectionFactory的入口。在點(diǎn)對(duì)點(diǎn)的模型中,它使用了javax.jms.QueueConnectionFactory;在發(fā)表-預(yù)訂模型中,它使用的是javax.jms.TopicConnectionFactory。

            目的地(Destination)——它是隊(duì)列或主題,這依賴于我們使用了下面哪種模型:javax.jms.Queue或javax.jms.Topic。

            連接(Connection)——它可能是客戶端和服務(wù)應(yīng)用之間的開放的TCP/IP。它可以被用于建立一個(gè)或少量的對(duì)話。在你的應(yīng)用程序能夠接收消息前,你必須調(diào)用start()方法。為了暫停發(fā)送消息,你需要調(diào)用stop()。

            對(duì)話(Session)——在JMS連接的幫助下建立的對(duì)象,被客戶端用作發(fā)送和接收消息。

            產(chǎn)生消息的部分(MessageProducer)——對(duì)話建立的對(duì)象,被用于在目的地中發(fā)送消息。

            使用消息的部分(MessageConsumer)——對(duì)話建立的對(duì)象,用于接收消息。為了同步接收消息,需要使用receive()方法。對(duì)于異步的情形,使用MessageListener和唯一的方法——onMessage()。在該方法中,在定義的消息到達(dá)后應(yīng)該執(zhí)行一定的操作。

            消息(Message)——消息本身。JMS消息由三個(gè)部分組成:

            · 消息頭

            · 屬性(不是必要的)

            · 消息體(不是必要的)

            本文沒有解釋更多的細(xì)節(jié)信息,你可以在官方文檔中找到具體的細(xì)節(jié)。
          主站蜘蛛池模板: 井陉县| 诏安县| 团风县| 乳山市| 珠海市| 永善县| 海晏县| 新化县| 新平| 静海县| 剑川县| 北辰区| 镇沅| 镇宁| 寻甸| 新龙县| 陆丰市| 滨州市| 永嘉县| 盖州市| 绥棱县| 彭阳县| 隆德县| 鹤峰县| 余江县| 泽普县| 衡南县| 滦平县| 西平县| 久治县| 米易县| 阿鲁科尔沁旗| 封丘县| 保亭| 商水县| 阿勒泰市| 郸城县| 九寨沟县| 武乡县| 义马市| 郑州市|