日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Weblogic下创建JMS消息服务

發(fā)布時(shí)間:2024/4/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Weblogic下创建JMS消息服务 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?http://hello-kitty-o.iteye.com/blog/805594

自帶的JMS消息服務(wù),看了網(wǎng)上一些配置后,總結(jié)了配置Weblogic JMS消息服務(wù)的步驟和注意事項(xiàng)。

????? weblogic的版本是9.2,創(chuàng)建JMS的消息服務(wù)大概有三個(gè)步驟,第一是創(chuàng)建JMS消息服務(wù)器,第二是創(chuàng)建JMS模塊,第三是創(chuàng)建連接工廠和主題等。下面具體步驟:

????? 1.創(chuàng)建JMS消息服務(wù)器

?

?

展開Services樹下的Messaging下的JMS Servers。鎖定修改,點(diǎn)擊新建按鈕。

??

JMS服務(wù)器的名稱為JMSServerTest,存儲(chǔ)消息介質(zhì)為null,點(diǎn)擊下一步。

?

?

目標(biāo)服務(wù)器設(shè)置為examplesServer。必須設(shè)置該項(xiàng)。

?

點(diǎn)擊Active Changes保存新建的JMS消息服務(wù)器。

?

?

新建一個(gè)JMS module名稱為SystemModuleTest。

?

?

?

選中Servers為examplesServer.

?

保存修改,可以看到新建的SystemModuleTest了。

接下來(lái)就要開始創(chuàng)建連接工廠和Topic了。點(diǎn)擊剛才新建的MOdule。點(diǎn)擊new。

?

?

?輸入Topic的JNDI名稱。

?

創(chuàng)建一個(gè)子部署項(xiàng)。

?

子部署項(xiàng)的名稱為TopicTest。

?

?

選擇JMS Server為剛才新建的JMSServerTest。點(diǎn)擊完成修改。接下來(lái)就是要新建連接工廠了。

?

?

?

?

輸入連接工廠的JNDI名稱。

?

?

選擇目標(biāo)位exampleServer。

?

?

?

?

如果應(yīng)用程序啟動(dòng)時(shí),報(bào)javax.naming.NameNotFoundException異常可以從weblogic的控制臺(tái)查看jndi樹信息。

查看的步驟是:wl_server----》Environment----》Servers

點(diǎn)擊郵編列表中的exampleServer(admin),在打開的頁(yè)面中點(diǎn)擊View JNDI Tree鏈接。
下圖就是所有的JDNI信息了。另外,weblogic的配置信息保存的路徑是

weblogic92\samples\domains\workshop\config

?

jms的配置路徑為weblogic92\samples\domains\workshop\config\jms

有時(shí),創(chuàng)建jms信息會(huì)提示你jndi名稱已經(jīng)存在了,但是在控制臺(tái)上卻看不到,就可以從這些xml中查看了。

?

?

?

?=========

在BEA WebLogic中使用Java消息服務(wù)


在最近兩年里,Sun引入了很多針對(duì)企業(yè)應(yīng)用程序開發(fā)的API。其中最令人興奮的是Java消息服務(wù)或者JMS。JMS API是為了在企業(yè)中進(jìn)行消息傳遞而設(shè)計(jì)的,其中,JNDI的任務(wù)是為目錄服務(wù)命名和提供目錄服務(wù),而JNBC的任務(wù)是提供數(shù)據(jù)庫(kù)訪問(wèn)。JMS是為了給企業(yè)消息傳遞提供一種通用工具而設(shè)計(jì)的API,它沒(méi)有考慮將消息發(fā)送到任何一臺(tái)應(yīng)用服務(wù)器的底層實(shí)現(xiàn),也沒(méi)有考慮您希望使用的其他企業(yè)消息傳遞軟件技術(shù)。對(duì)于那些創(chuàng)建或者使用面向消息的中間件(MOM)的開發(fā)人員,尤其是那些需要在自己的產(chǎn)品中使用這些工具的Java開發(fā)人員,這是一個(gè)很大的進(jìn)步。通過(guò)JMS,您應(yīng)該能夠編寫一組針對(duì)JMS API進(jìn)行消息傳遞的代碼,然后在任何提供JMS支持的消息傳遞系統(tǒng)中使用這些代碼。
  在本文中,我將向您展示如何創(chuàng)建一系列的消息生產(chǎn)者和消費(fèi)者,他們利用了JMS API的大部分函數(shù)來(lái)使用持久存儲(chǔ)的主題和隊(duì)列、創(chuàng)建臨時(shí)目的地、通過(guò)消息選擇器過(guò)濾消息,等等。我將在JMS的第一個(gè)供應(yīng)商的實(shí)現(xiàn)中實(shí)現(xiàn)這些例子,該實(shí)現(xiàn)是隨BEA的WebLogic應(yīng)用服務(wù)器一起提供的(關(guān)于該服務(wù)器以及配置JMS的詳細(xì)信息,可以從 www.JavaDevelopersJournal.com的“install.txt”在線文件中獲得)。在這一過(guò)程中,我將帶您一起經(jīng)歷實(shí)現(xiàn)這些應(yīng)用程序的必要步驟,其中包括修改應(yīng)用服務(wù)器來(lái)支持您將創(chuàng)建的示例代碼。
  在繼續(xù)創(chuàng)建下面的示例代碼之前,建議您先獲得并安裝最新版本的BEA/WebLogic應(yīng)用服務(wù)器。可以從BEA的網(wǎng)站 http://ecommerce.bea.com/index.jsp下載免費(fèi)使用試用版。

代碼
  包括在線的源文件在內(nèi),總共有4個(gè)源文件展示了如何在JMS中使用兩種不同的消息傳遞類型:發(fā)布/訂閱和點(diǎn)對(duì)點(diǎn)。Sender.java和Receiver.java展示了如何在JMS中使用Queue進(jìn)行點(diǎn)對(duì)點(diǎn)消息傳遞,而Publisher.java和Subscriber.java展示了如何使用Topic進(jìn)行發(fā)布/訂閱消息傳遞。“readme.txt”文件(也在網(wǎng)上)包含運(yùn)行各種應(yīng)用程序的命令以及有關(guān)代碼的最新信息。在嘗試運(yùn)行這些應(yīng)用程序之前,一定要先閱讀“install.txt”文件,并根據(jù)指示對(duì)WebLogic服務(wù)器進(jìn)行必要的修改。因?yàn)槭纠a中還包含一些注釋和JMS的更多細(xì)節(jié),本文無(wú)法完全介紹這些細(xì)節(jié),因此,我們鼓勵(lì)讀者檢查源代碼并運(yùn)行這些應(yīng)用程序。

Java消息服務(wù)
  Java消息服務(wù)被設(shè)計(jì)為一組接口,這些接口將由MOM供應(yīng)商和其他希望支持消息傳遞的供應(yīng)商(應(yīng)用服務(wù)器供應(yīng)商、數(shù)據(jù)庫(kù)服務(wù)器供應(yīng)商,等等)實(shí)現(xiàn)。這些接口為希望實(shí)現(xiàn)代碼的客戶應(yīng)用提供了一個(gè)公共API,針對(duì)可能的、給定數(shù)量的底層消息傳遞系統(tǒng)進(jìn)行消息傳遞。
  同時(shí),JMS的設(shè)計(jì)非常靈活,它可以在保持可移植性的同時(shí)提供對(duì)現(xiàn)有消息傳遞系統(tǒng)的廣泛支持。因此,它不支持每個(gè)消息傳遞系統(tǒng)中每種可能的消息傳遞選擇。盡管您可能熟悉任何給定的MOM產(chǎn)品,但JMS不會(huì)自動(dòng)支持該產(chǎn)品的每一個(gè)方面。
  JMS中的主要概念是Destination。Destination僅僅是消息生產(chǎn)者與消息消費(fèi)者之間的一種關(guān)聯(lián)。Destination分為兩種類型:Topic和Queue。為每種Destination類型定義的單獨(dú)接口允許供應(yīng)商支持其中一種類型或者兩種類型都支持,這取決于供應(yīng)商的消息傳遞工具。Topic是為發(fā)布/訂閱消息傳遞而設(shè)計(jì)的,而Queue是為客戶對(duì)客戶(點(diǎn)對(duì)點(diǎn))的消息傳遞設(shè)計(jì)的。這兩種Destination類型都支持持久性。JMS還提供了對(duì)事務(wù)的支持。事務(wù)使您能夠支持消息傳遞操作的提交和回滾。因此,如果事務(wù)中的操作失敗了,那么您可以對(duì)發(fā)生在該事務(wù)中的所用消息傳遞操作執(zhí)行回滾。同樣地,如果每件事都很順利,那么您可以提交這些消息傳遞操作,使它們持久可用。因?yàn)镴MS事務(wù)超出了本文的討論范圍,所以我將讓您自己去研究JMS的這些方面。

初始化JMS
連接工廠

  要初始化JMS,則需要使用ConnectionFactory,它是一個(gè)標(biāo)記接口,其中沒(méi)有任何方法,并且可以通過(guò)TopicConnectionFactory或者QueueConnectionFactory得以擴(kuò)展。供應(yīng)商實(shí)現(xiàn)這些工廠接口中的一個(gè)或者兩個(gè)接口均實(shí)現(xiàn),以提供對(duì)其特定消息傳遞服務(wù)實(shí)現(xiàn)的訪問(wèn)。WebLogic提供了每種Factory類型的一般實(shí)現(xiàn)。Factory,以及Topic和Queue,都被認(rèn)為是“托管”對(duì)象,因此它們都是WebLogic服務(wù)器在開機(jī)時(shí)創(chuàng)建的(在我們的例子中,我們將使用WebLogic的JMS實(shí)現(xiàn))。然后,可以通過(guò)JNDI檢索這些托管對(duì)象。還可以使用JNDI命名上下文來(lái)檢索這些托管對(duì)象。
  如果這看起來(lái)有點(diǎn)讓您感到迷惑,不要擔(dān)心,示例代碼會(huì)使您很容易理解它們。您還可以在WebLogic中創(chuàng)建自己的Factory對(duì)象,而不是使用默認(rèn)的Factory,這項(xiàng)操作是在weblogic.properties文件中完成的。用戶定義的Factory將在后面進(jìn)行討論,這一節(jié)主要關(guān)注Topic,定義自己的Factory的詳細(xì)信息包含在“install.txt”文件中,該文件以及本文的源代碼都可以在網(wǎng)上找到。
  以下代碼來(lái)自Sender.java示例,它將向您展示如何初始化JMS,以及如何從JNDI中獲得Queue的ConnectionFactory:

public final String JMS_FACTORY = “javax.jms.QueueConnectionFactory”;

queueFx = (QueueConnectionFactory) initCtx.lookup(JMS_FACTORY);

  Queue的默認(rèn)ConnectionFactory的名稱被傳遞到初始JNDI命名上下文的lookup()方法中。然后會(huì)把對(duì)QueueConnectionFactory實(shí)現(xiàn)的引用從WebLogic應(yīng)用服務(wù)器返回給我們(Sender.java 示例代碼中的getInitialContext()方法展示了初始化JNDI和從WebLogic中獲得初始命名上下文的細(xì)節(jié)。您可以從Sun的網(wǎng)站獲得關(guān)于API的詳細(xì)信息。網(wǎng)址是: http://java.sun.com/products/jndi/1.2/javadoc/index.html)。
  因?yàn)镃onnectionFactories 是托管對(duì)象,所以由WebLogic應(yīng)用服務(wù)器負(fù)責(zé)為Queue、Topic以及所有用戶定義的Factory創(chuàng)建默認(rèn)ConnectionFactories,并將它們與WebLogic JNDI實(shí)現(xiàn)中的名稱綁定在一起,以便通過(guò)客戶端代碼進(jìn)行查找。因此,在JNDI中,Queue的默認(rèn)ConnectionFactory的名稱是“javax.jms.QueueConnectionFactory”,在通過(guò)JNDI查找該名稱的時(shí)候,將返回一個(gè)對(duì)這個(gè)接口的默認(rèn)實(shí)現(xiàn)的引用,該引用是由WebLogic提供的。Topic也有一個(gè)默認(rèn)的ConnectionFactory,它遵循相同的格式,即“javax.jms.TopicConnectionFactory”。通過(guò)JNDI進(jìn)行查找將返回一個(gè)對(duì)TopicConnectionFactory默認(rèn)實(shí)現(xiàn)的引用,它也是WebLogic提供的。

連接
  在成功創(chuàng)建正確的ConnectionFactory后,下一步將是創(chuàng)建一個(gè)“連接”,它是JMS定義的一個(gè)接口,表示連接到底層消息傳遞供應(yīng)商的客戶機(jī)連接。ConnectionFactory負(fù)責(zé)返回可以與底層消息傳遞系統(tǒng)進(jìn)行通信的Connection實(shí)現(xiàn)。通常客戶機(jī)只使用單一連接。根據(jù)JMS文檔,Connection的目的是“利用JMS提供者封裝開放的連接”,以及表示“客戶機(jī)與提供者服務(wù)例程之間的開放TCP/IP套接字。該文檔還指出Connection應(yīng)該是進(jìn)行客戶機(jī)身份驗(yàn)證的地方,除了其他一些事項(xiàng)外,客戶機(jī)還可以指定惟一標(biāo)志符。像ConnectionFactories一樣,Connections也有兩種類型,這取決于您將使用的Destination類型。QueueConnection和TopicConnection 都擴(kuò)展了基本的Connection接口,通常,您只能使用其中的一個(gè),使用哪一個(gè)則取決于客戶將使用的消息傳遞方式。Connection的創(chuàng)建是通過(guò)ConnectionFactory完成的。Connection包含兩種重要的方法:start和stop,開始和停止在連接過(guò)程中發(fā)送和接收消息。請(qǐng)參見(jiàn)清單1中的完整代碼塊。

會(huì)話
  一旦從ConnectionFactory中獲得一個(gè)Connection,就必須從Connection中創(chuàng)建一個(gè)或者多個(gè)會(huì)話。Session也是基本接口,同時(shí),有兩種擴(kuò)展基本接口的特定于Destination的接口:QueueSession和TopicSession,它們可以提供特定于Queue或者Topic的Session方法。Session是為Destination類型生產(chǎn)消息的消費(fèi)者或生產(chǎn)者的工廠的一種類型(如果Destination類型是QueueSession,那么它將創(chuàng)建面向Queue的生產(chǎn)者和消費(fèi)者;如果Destination類型是TopicSession,那么它將創(chuàng)建面向Topic的生產(chǎn)者和消費(fèi)者)。
  Session可以被事務(wù)化,也可以不被事務(wù)化,通常,您可以通過(guò)向Connection上的適當(dāng)創(chuàng)建方法傳遞一個(gè)布爾參數(shù)對(duì)此進(jìn)行設(shè)置。同樣,您也可以向Connection的Session創(chuàng)建方法傳遞一個(gè)參數(shù),該方法可以設(shè)置將創(chuàng)建的Session的消息確認(rèn)模式,而該模式將指定是由客戶機(jī)還是由消費(fèi)者來(lái)確認(rèn)它所檢索的任何信息(如果使用事務(wù)機(jī)制,則忽略該參數(shù))。Session提供的其他方法是各種消息創(chuàng)建方法,這些方法允許您創(chuàng)建包含文本、字節(jié)、屬性甚至串行化Java對(duì)象的特定類型的JMS消息(有關(guān)的更多信息在下面的Message接口上)。圖1是實(shí)際JMS接口的繼承和創(chuàng)建關(guān)系的圖表,請(qǐng)參見(jiàn)清單1中的代碼。

(暫缺圖)

目的地(Destination)
  在創(chuàng)建任何消息的生產(chǎn)者或消費(fèi)者之前,必須要有特定的Destination,通過(guò)它您可以將任何生產(chǎn)者與消費(fèi)者聯(lián)系起來(lái)。記住,Destination是托管對(duì)象,類似ConnectionFactories。這意味著Destination是由WebLogic維護(hù)的,必須通過(guò)JNDI查找來(lái)檢索它。這還意味著,在這種情況下,Destination必須是事先定義好的。但這并不是說(shuō)您總是要提前創(chuàng)建Destination。JMS API提供了創(chuàng)建臨時(shí)Destination的能力,但這個(gè)Destination只能在創(chuàng)建它的Session的生存周期中使用,JMS API也能在運(yùn)行時(shí)創(chuàng)建永久性Destination。然而,在JMS當(dāng)前的WebLogic實(shí)現(xiàn)中,應(yīng)該注意的是,如果通過(guò)Session創(chuàng)建Destination,那么只要WebLogic服務(wù)器在運(yùn)行,這些Destination就會(huì)存在。如果服務(wù)器出故障或者死機(jī)了,那么Destination也會(huì)不存在。創(chuàng)建真正的永久性Destination的方法是在weblogic.properties文件中創(chuàng)建它(請(qǐng)參閱“install.txt”文件,以獲得關(guān)于如何做到這一點(diǎn)的詳細(xì)信息)。
  鑒于本文的目的,我們的Destination是通過(guò)weblogic.properties文件提前創(chuàng)建的。該文件中定義的Destination是WebLogic應(yīng)用服務(wù)器在開機(jī)時(shí)創(chuàng)建的,并且可以通過(guò)JNDI用于客戶代碼。清單1顯示了Send.java文件中的代碼,展示了如何創(chuàng)建QueueConnection和QueueSession,以及如何像檢索Sender應(yīng)用程序的包層次結(jié)構(gòu)那樣檢索Destination,我們?cè)趙eblogic.properties文件中定義的隊(duì)列的名稱為“jdj.article.queue.sender”。

消息的消費(fèi)者和消息的生產(chǎn)者
  JMS初始化過(guò)程的最后一個(gè)階段是創(chuàng)建MessageConsumers和MessageProducers。像 ConnectionFactory一樣,它們也有Connection 和Session兩個(gè)基本接口,為了使用Topic或者Queue,還有一些擴(kuò)展這兩個(gè)基本接口的特定于Destination的基本接口。(我在使用MessageProducer時(shí)使用Producer這個(gè)術(shù)語(yǔ),在使用MessageConsumer時(shí)使用Consumer這個(gè)術(shù)語(yǔ))。MessageConsumers用于檢索發(fā)送到Destination的消息,MessageProducers用于將消息發(fā)送到Destination。二者均由Session實(shí)例創(chuàng)建。MessageProducer由特定于Destination的接口QueueSender和TopicPublisher擴(kuò)展。MessageConsumer則由QueueReceiver和TopicSubscriber接口擴(kuò)展。
  一旦已經(jīng)創(chuàng)建了自己的MessageConsumer和/或MessageProducer,也就做好了接收和/或發(fā)送消息的所有準(zhǔn)備。因?yàn)樯a(chǎn)者和消費(fèi)者的創(chuàng)建是特定于Queue或Topic的,所以我將在下面的相關(guān)小節(jié)中討論特定于Destination類型的這兩種類型的處理。

消息
  在進(jìn)入下一步并開始深入探討Topic和Queue中的消息發(fā)送和接收之前,我們需要討論另一個(gè)接口,即Message,它表示JMS消息本身。這個(gè)對(duì)象包含將發(fā)送到Destination的信息,以及正在Destination上進(jìn)行監(jiān)聽(tīng)的消費(fèi)者接收的信息。Message是由會(huì)話實(shí)例創(chuàng)建的,它由三個(gè)部分組成:消息頭、屬性和消息體。消息頭是用來(lái)識(shí)別和路由消息的,客戶端開發(fā)人員通常不會(huì)看到或者處理消息頭信息。屬性支持通過(guò)消息傳遞的特定于應(yīng)用程序的值。這些屬性字段是預(yù)先定義的,對(duì)它們的完整描述可以在JMS文檔中找到。我將在示例代碼中使用一些屬性。消息的主體部分是消息的實(shí)際“有效負(fù)載”,它有5種類型,可以通過(guò)5個(gè)特定的接口來(lái)表示它們:StreamMessage、MapMessage、ObjectMessage、TextMessage 和BytesMessage(參見(jiàn)圖1)。

持久性
  JMS還有一個(gè)重要方面值得討論:它支持消息的持久傳遞。很簡(jiǎn)單,這意味著當(dāng)消息發(fā)送到Destination時(shí),如果Consumer沒(méi)有運(yùn)行或不可用,那么這個(gè)消息將被保存起來(lái),直至下次Consumer連接到Destination為止。例如,如果您有5個(gè)應(yīng)用程序在某一個(gè)Topic上進(jìn)行監(jiān)聽(tīng),其中一個(gè)崩潰了,那么下一次該應(yīng)用程序啟動(dòng)并連接到這個(gè)特定的Topic時(shí),盡管該應(yīng)用程序崩潰了,但發(fā)送到這個(gè)Topic的所有消息都將在應(yīng)用程序開始再次進(jìn)行監(jiān)聽(tīng)時(shí)發(fā)送到這個(gè)應(yīng)用程序。如果這看起來(lái)難以理解,那么在您運(yùn)行示例代碼時(shí)就會(huì)更有意義。

隊(duì)列
  Queue是為“點(diǎn)對(duì)點(diǎn)”或“一對(duì)一”的消息傳遞而設(shè)計(jì)的。這意味著應(yīng)該只有一臺(tái)客戶機(jī)發(fā)送消息給Queue,并且只有一個(gè)應(yīng)用程序可以處理這個(gè)Queue中的消息。
事實(shí)上,您可以有多臺(tái)向某一個(gè)Queue發(fā)送消息的客戶機(jī),但只能有一個(gè)應(yīng)用程序處理該Queue中的消息。如果在Queue上有多個(gè)Consumer,那么哪個(gè)Consumer接收消息將無(wú)法保證,但是只能有一個(gè)Consumer接收消息。如果Destination上需要多個(gè)Consumer,并且想讓它們都收到相同的消息,那么應(yīng)該使用Topic(參見(jiàn)本文后面內(nèi)容)。
  Sender.java和Receiver.java文件中包含展示如何使用Queue的代碼。這些代碼展示了JMS的初始化過(guò)程,并展示了如何檢索預(yù)定義的Queue,以及為了在Queue上發(fā)送和接收消息,應(yīng)該如何創(chuàng)建MessageProducer和MessageConsumer。
  為了在Queue中消費(fèi)和產(chǎn)生消息,系統(tǒng)中有兩個(gè)特定接口。其中一個(gè)接口是QueueSender,它是通過(guò)調(diào)用QueueSession的一個(gè)createQueueSender()方法,從QueueSession返回的,用于向Queue發(fā)送消息。另一個(gè)接口是QueueReceiver,它是通過(guò)調(diào)用QueueSession的一個(gè)createQueueReceiver()方法,從QueueSession返回的,用于接收來(lái)自Queue的消息。
  清單2是來(lái)自Sender.java的sendMsg方法的代碼,它展示了如何從Session中如何創(chuàng)建MessageProducer,然后構(gòu)造一個(gè)TextMessage并發(fā)送它。在這段代碼中,我們將創(chuàng)建一個(gè)QueueSender,然后創(chuàng)建一個(gè)TextMessage,它包含從應(yīng)用程序用戶界面的TextField中檢索到的文本。隨后,我們使用QueueSender方法“發(fā)送”消息。
  在MessageConsumer上,有兩種處理傳入消息接收的方法:同步的和異步的。第一步是創(chuàng)建MessageConsumer;下一步是判斷您想在Consumer上同步發(fā)送信息還是異步發(fā)送消息。
  在從Session中創(chuàng)建了MessageConsumer之后,如果想同步接收為Destination生成的下一條消息,那么可以調(diào)用MessageConsumer上的檢索方法。該方法沒(méi)有采用任何參數(shù),在接收下一個(gè)Message之前,它將一直受阻,并且會(huì)將這個(gè)Message返回給調(diào)用者。為了接收異步消息,可以向MessageConsumer注冊(cè)一個(gè)MessageListener接口的實(shí)現(xiàn)。這種方法對(duì)Topic 和 Queue都適用。MessageListener只有一個(gè)您必須實(shí)現(xiàn)的方法 —— onMessage,它只接收一個(gè)參數(shù),即Message。在為每個(gè)發(fā)送到Destination的消息實(shí)現(xiàn)onMessage時(shí),將調(diào)用該方法。Sender.java和Receiver.java中的onMessage實(shí)現(xiàn)中示范了這個(gè)過(guò)程。在Receiver.java中,我們將下面的代碼放入initializeJMS方法中,這段代碼將創(chuàng)建MessageConsumer(一個(gè)QueueReceiver)并設(shè)置MessageListener的實(shí)現(xiàn):

// Create a Receiver for the Queue…
receiver = session.createReceiver(queue);
// Set the listener (this class)
receiver.setMessageListener(this);

  一旦調(diào)用了Connection的start方法,消息就會(huì)在到達(dá)Destination之時(shí)開始進(jìn)入Consumer。

ReplyTo——使用臨時(shí)隊(duì)列
  您還會(huì)注意到,Sender.java和Receiver.java都實(shí)現(xiàn)了MessageConsumers和MessageProducers。二者都實(shí)現(xiàn)了MessageListener。這說(shuō)明了JMS的一個(gè)有趣特征,也就是說(shuō),它使用了臨時(shí)Destination。希望接收它所產(chǎn)生信息的響應(yīng)的應(yīng)用程序可以創(chuàng)建一個(gè)臨時(shí)的Queue或者Topic,并在它發(fā)送的Message中傳遞這個(gè)Destination。
Message的屬性之一是JMSReplyTo屬性。這個(gè)屬性就是用于這個(gè)目的的。您可以創(chuàng)建一個(gè)臨時(shí)的Queue或者Topic,并把它放入Message的JMSReplyTo屬性中。收到該消息的消費(fèi)者有一個(gè)私有的臨時(shí)Destination,可以用它來(lái)響應(yīng)發(fā)送者。可以通過(guò)兩種方法對(duì)這一點(diǎn)進(jìn)行說(shuō)明,這兩種方法分別在兩個(gè)文件中。Sender.java中包含如下所示代碼段,它將創(chuàng)建臨時(shí)的Queue,并將它放置在TextMessage的JMSReplyTo屬性中:

// Create a temporary queue for replies…
tempQueue = (Queue) session.createTemporaryQueue();

  以上這行代碼可以在Sender.java的initializeJMS方法中找到。這段代碼將在啟動(dòng)應(yīng)用程序時(shí)創(chuàng)建一個(gè)臨時(shí)Queue,而這個(gè)Queue將存在于應(yīng)用程序的整個(gè)生命周期中。下面這行代碼可以在Sender.java的sendMsg方法中找到,它展示了如何設(shè)置JMSReplyTo屬性,以包含臨時(shí)的Queue。

// Set ReplyTo to temporary queue…
msg.setJMSReplyTo(tempQueue);

  在Receiver.java的QueueReceiver接收這條消息時(shí),會(huì)從JMSReplyTo字段中提取臨時(shí)Queue,并且會(huì)通過(guò)應(yīng)用程序構(gòu)造一個(gè)QueueSender,以便將響應(yīng)消息發(fā)送回Sender.java。這展示了如何使用JMS Message的屬性,并顯示了私有的臨時(shí)Destination的有用之處。它還展示了客戶機(jī)可以如何既是消息的Producer,有是消息的Consumer。下面的代碼來(lái)自Receiver.java,它展示了如何從JMS Message中提取臨時(shí)Queue;可以在onMessage方法中找到這些代碼:

// Get the temporary queue from the JMSReplyTo
// property of the message…
tempQueue = (Queue) msg.getJMSReplyTo();

  以下代碼塊來(lái)自sendReplyToMsg方法,它展示了如何創(chuàng)建QueueSender和如何發(fā)送應(yīng)答:

// create a Sender for the temporary queue
if (sender == null)
sender = session.createSender(tempQueue);
TextMessage msg = session.createTextMessage();
msg.setText(REPLYTO_TEXT);

// Send the message to the temporary queue…
sender.send(msg);

主題
  Topic是為了實(shí)現(xiàn)“發(fā)布/訂閱”消息傳遞機(jī)制而設(shè)計(jì)的。而Queue是為了擁有一個(gè)Producer和一個(gè)Consumer而設(shè)計(jì)的,Topic的設(shè)計(jì)目標(biāo)是允許擁有多個(gè)能發(fā)送消息給它的Producer,同時(shí)擁有多個(gè)能接收來(lái)自Topic的同一消息的Consumer。
  Topic的MessageProducers和MessageConsumers的創(chuàng)建過(guò)程與Queue的類似。您可以使用Session來(lái)創(chuàng)建TopicPublishers和TopicSubscribers。之所以存在QueueSender和QueueReceiver鏡像,是因?yàn)樗鼈兌继峁┝颂囟ㄓ赥opic的功能,并且都實(shí)現(xiàn)了基本的MessageProducer和MessageConsumer接口。
  TopicPublisher的創(chuàng)建過(guò)程幾乎與QueueSender的創(chuàng)建過(guò)程完全相同。以下代碼來(lái)自Publisher.java的sendMsg方法,它展示了TopicPublisher的創(chuàng)建過(guò)程,以及如何向Topic發(fā)布消息:

// create a Publisher if there isn’t one…
if (publisher == null)
publisher = session.createPublisher(topic);
TextMessage msg = session.createTextMessage();
msg.setText(text);

// Publish it to the topic…
publisher.publish(msg);

持久訂閱者
  TopicSubscribers一個(gè)有趣的方面是它的持久訂閱者,即用戶提供的惟一名稱,可以在Session中識(shí)別這個(gè)名稱。Session擁有一個(gè)與之相關(guān)的Client ID,這個(gè)ID要么是通過(guò)Connection上的一個(gè)方法調(diào)用在運(yùn)行時(shí)定義的,要么是作為托管ConnectionFactory的一部分(在我們的例子中,它是在weblogic.properties文件中用這種方法定義的)。因此,一個(gè)Connection可以提供一個(gè)帶有Client ID的Session,并且持久訂閱者的名稱是Session中的惟一標(biāo)識(shí)符,它與特定的Client ID相關(guān)聯(lián)。持久訂閱者的目的是為給定的Topic創(chuàng)建一個(gè)惟一的、持久的Consumer。
  通過(guò)調(diào)用TopicSession的createDurableSubscriber方法創(chuàng)建TopicSubscriber的應(yīng)用程序必須傳遞一個(gè)持久訂閱者的名稱(一個(gè)字符串)作為其參數(shù)之一;例如,您可以將持久訂閱者的名稱設(shè)置為目前已登錄的用戶的名稱,等等。這個(gè)名稱惟一地標(biāo)識(shí)出了某一Topic的特殊訂閱者(連同Connection/Session的惟一Client ID)。一旦已經(jīng)向Topic注冊(cè)這個(gè)持久訂閱者,該Topic就會(huì)持久性地確保消息被發(fā)送到這個(gè)訂閱者那里。這意味著如果某一特殊的持久訂閱者是不可用的,那么將會(huì)一直保存消息,直到下次這個(gè)持久訂閱者(有相同的、惟一的持久訂閱者名稱和Client ID)注冊(cè)為一個(gè)Consumer為止。Subscriber.java 文件展示了持久訂閱者的創(chuàng)建過(guò)程,并允許您使用默認(rèn)的訂閱者名稱,或者從命令行設(shè)置這個(gè)標(biāo)識(shí)符(要得到關(guān)于運(yùn)行這個(gè)應(yīng)用程序和展示通過(guò)擁有持久訂閱者獲得消息永久性的更多細(xì)節(jié),請(qǐng)參閱“readme.txt”)。下列代碼片段來(lái)自Subscriber.java的initializeJMS方法,它展示了如何從TopicSession中創(chuàng)建一個(gè)持久訂閱者:

subscriber = session.createDurableSubscriber(
topic,
subscriberID,
SELECTOR,
false);
// Set the listener (this class)
subscriber.setMessageListener(this);

  TopicSubscribers并沒(méi)有被創(chuàng)建為持久訂閱者,因此它不會(huì)持久性地接收消息,而是只在運(yùn)行期間接收消息。
  要想獲得關(guān)于持久訂閱者和Topic的更進(jìn)一步的信息,請(qǐng)參閱Sun的JMS文檔。關(guān)于上述代碼的另外一點(diǎn)是:注意傳遞給該方法的第三個(gè)參數(shù),這個(gè)參數(shù)是SELECTOR。這是消息選擇器與Consumer有關(guān)聯(lián)的地方(請(qǐng)參閱下面內(nèi)容,以獲得關(guān)于消息選擇器的更多信息)。

過(guò)濾——使用消息選擇器
  我們將討論的有關(guān)JMS的最后一個(gè)方面是消息選擇器,消息選擇器是用于MessageConsumers的過(guò)濾器,可以用來(lái)過(guò)濾傳入消息的屬性和頭文件部分(但不過(guò)濾消息體),并確定是否將實(shí)際消費(fèi)該消息。按照J(rèn)MS文檔的說(shuō)法,消息選擇器是一些字符串,它們基于某種語(yǔ)法,而這種語(yǔ)法是SQL-92的子集。您可以將消息選擇器作為MessageConsumer創(chuàng)建的一部分。根據(jù)MessageConsumer是QueueReceiver還是TopicSubscriber,這種將消息選擇器應(yīng)用于傳入信息的方法也會(huì)稍有不同。我建議您通過(guò)檢查Subscriber.java文件以及運(yùn)行Publisher和Subscriber應(yīng)用程序,檢查消息收集器的語(yǔ)法,并查看如何應(yīng)用它們。以下代碼段在Subscriber.java中定義了消息選擇器,而應(yīng)用程序本身允許您從文本域中改變這個(gè)選擇器:

public final String SELECTOR = “JMSType = ‘TOPIC_PUBLISHER’”;

  該選擇器檢查了來(lái)自Topic的傳入消息的JMSType屬性,并確定了這個(gè)屬性的值是否等于TOPIC_PUBLISHER。如果相等,則將消息傳遞到MessageListener實(shí)現(xiàn);如果不相等,那么消息會(huì)被忽略。請(qǐng)參閱“readme.txt”文件,以獲得關(guān)于運(yùn)行這些應(yīng)用程序和展示其行為的更多細(xì)節(jié)。此外還建議您參閱Sun的JMS文檔。

結(jié)束語(yǔ)
  JMS是一項(xiàng)在應(yīng)用程序中創(chuàng)建可移植消息傳遞代碼的很有吸引力的、功能強(qiáng)大的技術(shù)。它允許進(jìn)行“點(diǎn)對(duì)點(diǎn)”和“發(fā)布/訂閱”消息傳遞,而且還支持事務(wù)和持久性。BEA的WebLogic應(yīng)用服務(wù)器提供了一種健壯并完整的JMS實(shí)現(xiàn),它能與應(yīng)用服務(wù)器提供的其他技術(shù)一同工作,比如EJB和servlet。這為通過(guò)事務(wù)支持在不同企業(yè)對(duì)象和服務(wù)間進(jìn)行永久的,異步的消息傳遞創(chuàng)造了極大的可能。我希望本文可以鼓勵(lì)您開發(fā)在線示例代碼,并且可以鼓勵(lì)您檢查WebLogic(尤其是JMS)提供的可能性。

原文出處
http://www.sys-con.com/story/?storyid=42639&de=1

?

?

?

總結(jié)

以上是生活随笔為你收集整理的Weblogic下创建JMS消息服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。