国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

利用JMS建立消息傳遞系統(tǒng)

2019-11-18 11:35:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  在開(kāi)始之前需要說(shuō)明,為了理解本文,我們希望讀者擁有java編程的相當(dāng)堅(jiān)實(shí)的基礎(chǔ)。我們將試圖盡可能簡(jiǎn)單地解釋什么是JMS,但是在你能夠建立自己的程序并正確地理解它們之前,你需要有一些使用JNDI開(kāi)發(fā)實(shí)際應(yīng)用程序的經(jīng)驗(yàn)。

  JMS(Java消息服務(wù))是一個(gè)消息交換標(biāo)準(zhǔn),它答應(yīng)使用J2EE應(yīng)用程序組件建立、發(fā)送、接收和讀取消息。它假設(shè)分布式通訊擁有自由(free)的連接、是可靠的(reliable)和異步的(asynchronous)。

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

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

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

利用JMS建立消息傳遞系統(tǒng)

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

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

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

  · 系統(tǒng)組件沒(méi)有直接地彼此相連。它們被分離開(kāi)了,這就是在運(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ù)訂模型看起來(lái)更加“優(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)你的應(yīng)用程序建立、發(fā)送、接收和讀取消息。這組程序集位于J2EE程序包結(jié)構(gòu)樹(shù)上的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í)支持消息交換的兩種“基本的”模型。但是,其說(shuō)明(specification)并沒(méi)有要求廠商同時(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樹(shù)關(guān)聯(lián)起來(lái),這樣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)用之間的開(kāi)放的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è)部分組成:

  · 消息頭

  · 屬性(不是必要的)

  · 消息體(不是必要的)

  本文沒(méi)有解釋更多的細(xì)節(jié)信息,你可以在官方文檔中找到具體的細(xì)節(jié)。

  什么時(shí)候使用EJB 2.0

  請(qǐng)注重下述各項(xiàng)內(nèi)容:

  在新的EJB 2.0規(guī)范中,與JMS的集成是通過(guò)建立新的EJB類(lèi)型——消息驅(qū)動(dòng)Bean(MDB)來(lái)實(shí)現(xiàn)的。MDB的特性是客戶端不會(huì)使用遠(yuǎn)程接口(remote interface)與它通訊。其交互操作的唯一途徑是通過(guò)消息發(fā)送。MDB僅僅是消息監(jiān)聽(tīng)程序,是一個(gè)實(shí)現(xiàn)了javax.ejb.MessageDrivenBean和javax.jms.MessageListener接口的類(lèi),沒(méi)有任何其它的功能。其中的第一個(gè)接口只有兩個(gè)方法:setMessageDrivenContext() 和ejbRemove()。第二個(gè)接口只有一個(gè)方法:onMessage()。這個(gè)規(guī)范還需要一個(gè)不帶參數(shù)的ejbCreate()建立方法??蛻舳瞬粫?huì)直接與MDB通訊;它不會(huì)建立MDB。容器(container)自身決定什么時(shí)候和需要多少個(gè)MDB來(lái)處理來(lái)自特定目的地的消息。MDB的主要缺陷是它只能從一個(gè)目的地接收到消息。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 陆丰市| 青龙| 乌拉特前旗| 中西区| 邮箱| 周口市| 临江市| 雷州市| 且末县| 健康| 霸州市| 邓州市| 汝州市| 合作市| 三穗县| 青海省| 河北省| 宝兴县| 泾川县| 东方市| 介休市| 乳源| 平昌县| 姚安县| 铜川市| 民乐县| 清新县| 武胜县| 阿拉善左旗| 色达县| 化隆| 漳平市| 宣威市| 安阳县| 南京市| 海淀区| 偏关县| 涞源县| 梁河县| 花莲市| 昭平县|