• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

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

    發布: 2007-6-10 17:46 | 作者: Scott Grant | 來源: bea | 查看: 21次 | 進入軟件測試論壇討論

    領測軟件測試網

     

     

     

     

     

     

     

     

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

    代碼
      包括在線的源文件在內,總共有4個源文件展示了如何在JMS中使用兩種不同的消息傳遞類型:發布/訂閱和點對點。Sender.java和Receiver.java展示了如何在JMS中使用Queue進行點對點消息傳遞,而Publisher.java和Subscriber.java展示了如何使用Topic進行發布/訂閱消息傳遞!皉eadme.txt”文件(也在網上)包含運行各種應用程序的命令以及有關代碼的最新信息。在嘗試運行這些應用程序之前,一定要先閱讀“install.txt”文件,并根據指示對WebLogic服務器進行必要的修改。因為示例代碼中還包含一些注釋和JMS的更多細節,本文無法完全介紹這些細節,因此,我們鼓勵讀者檢查源代碼并運行這些應用程序。

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

    初始化JMS
    連接工廠

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

    public final String JMS_FACTORY = "javax.jms.QueueConnectionFactory";
    ...
    queueFx = (QueueConnectionFactory) initCtx.lookup(JMS_FACTORY);

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

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

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

    (暫缺圖)

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


    1 2 下一頁>>




    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>