WID/WPS 中開發、配置 JMS 作為訊息中介軟體的應用

isoa發表於2009-05-07

WPS 的訊息體系概述

WPS 支援面向服務的應用架構 (Service-Oriented Architecture,SOA) 和企業服務匯流排 (Enterprise Service Bus,ESB),使用統一的服務呼叫和業務表現模型,並遵循業界的開放標準。圖 1 描述了 WPS 執行環境的基本組成。


圖 1. WPS 的體系結構
WPS 的體系結構

WPS 使用服務元件架構(Service Component Architecture,SCA)作為統一的服務呼叫模型。SCA 是一種通用的面向業務服務的元件模型。它使現有的各種服務,包括 EJB,Web 服務,Java 程式碼以及業務流程執行語言(Business Process Execution Language,BPEL)等,有了統一的抽象表示,從而實現了業務邏輯和實現邏輯的分離。

SCA 執行環境中最基本的單位是 SCA 模組(SCA Module)。一個 SCA 模組由一個或多個 SCA 元件(SCA Component)構成,SCA 元件通過其介面向其客戶提供服務。一般,元件之間存在著依賴關係,即一個元件可以使用其它元件提供的服務,也可以為其它元件提供服務。

SCA 支援客戶以同步或者非同步互動方式來呼叫服務介面中的方法。同步互動方式是指客戶端呼叫方法後一直等待,直到方法返回結果。此外,SCA 支援三種非同步互動方式:

1)限時響應 (Deferred Response),客戶呼叫方法後,過一段時間後讀取結果;

2)單向呼叫 (One-way),客戶呼叫方法後,不等待呼叫結果,繼續自己的動作;

3)回撥方法 (Callback),客戶呼叫方法後,繼續自己的動作,當結果返回時,另一個客戶執行緒被觸發以讀取結果。

SCA 使用內嵌的 Service Integration Bus (SIBus) 訊息引擎來支援元件間的非同步通訊。SIBus 實際上是一個基於 Java Message Service (JMS) 規範的訊息中介軟體。為了便於整合使用其他訊息機制的企業應用,WPS 還包含對以下 JMS 提供者的支援,這些 JMS 提供者必須符合 JMS 規範 V1.1:

  • WebSphere MQ JMS 提供者
  • 通用 JMS 提供者 (Generic JMS Provider)
  • V5 訊息傳遞提供者

    JMS 提供者簡介

    通用 JMS 繫結應用程式需要與通用 JMS 提供者一起工作。WPS 提供了對通用 JMS 提供者的支援。通用 JMS 提供者是為使用任何第三方訊息傳遞系統而提供的。對 WPS 來說,通用 JMS 提供者提供這樣一種產品,該產品支援在 JMS 規範 V1.1 中定義的應用程式伺服器工具 (ASF) 功能而不支援在 JCA 規範 V1.5 中定義的入站資源介面卡。通用 JMS 產品主要有 Oracle WebLogic, Oracle Advanced Queuing (AQ), SonicMQ, TIBCO 和 webMethods。SIB 不在此列,因為它是 JCA 1.5 JMS 提供者。

    Oracle AQ 是 Oracle 公司發行的基於 Oracle 資料庫的高階訊息佇列處理系統。本例以 Oracle AQ 作為外部訊息系統,介紹 SCA 模組如何在 WPS 與 Oracle AQ 之間通過 JMS 繫結來接受和傳送訊息。您將在後面的介紹中看到如何在 WID/WPS 中開發、配置、部署以 Oracle AQ 為通用 JMS 提供者的應用程式。

    實現業務場景

    下面我們以一個簡單的場景為例,介紹如何在 WebSphere Integration Developer(WID) 中開發使用通用 JMS 服務的應用程式。WID 是一個基於 Eclipse 的整合開發環境,它使用一系列視覺化構造工具便於使用者開發 SCA 元件和業務應用。

    場景描述:記錄客戶從網頁輸入的個人資訊,並通過 Oracle AQ 傳遞給後臺應用,用網頁輸出模擬後臺應用。

    建立 SCA 模組

    開啟 WID 並關閉歡迎介面,以進入 Business Integration 透檢視。如果此透檢視已關閉,可以通過選擇 Window -> Open Perspective -> Other -> Business Integration 來重新開啟它:


    圖 2. Business Integration 透檢視
    Business Integration 透檢視

    建立 SCA 模組的步驟如下:

    1. 選擇 File -> New -> Module;
    2. 輸入模組名字 HelloGenJMS,點選 Next;
    3. 保留預設設定,點選 Finish。

    此時在左邊的 Business Integration 視窗中會建立一個名為 HelloGenJMS 的專案。

    建立介面

    選擇 HelloGenJMS-> Interfaces,右鍵選單選擇 New->Interface,輸入介面名字 IHello,點選 Finish。這時將開啟一個新介面編輯頁面,目前此頁面大部分為空白,因為這個介面尚未定義任何方法。接下來我們要為介面新增方法,這裡的方法代表服務的實現。為了簡單起見,我們將建立一個“單向的”(one-way) 方法,該方法沒有返回值。

    建立方法的步驟如下:

    1. 單擊 Add One Way Operation 圖示,以向介面表新增一個行。
    2. 將此行中的預設名稱由 operation1 更改為 hello。
    3. 將輸入引數的預設名稱由 input1 更改為 customerInfo。
    4. 單擊 Type 列並選擇 New,以建立一個新業務物件型別來充當輸入。在 Data Type Selection 彈出選單中單擊 New。

      圖 3. 定義介面
      定義介面

    5. 在隨即開啟的 New Business Object 對話方塊中,指定名稱 CustomerInfo,並單擊 Finish -> OK。
    6. 新 CustomerInfo 業務物件現在應出現在 Type 列中。右鍵單擊它,並選擇 Open in Business Object Editor,將開啟一個新編輯器,可以在其中詳細定義這個新業務物件。
    7. 重複單擊 Business object 右側的 Add an attribute to a business object,設定 first_name, last_name, email 的屬性。

      圖 4. 編輯業務物件
      編輯業務物件

    8. 關閉皮膚,並選擇儲存更改。
    9. 儲存介面。

    建立 SCA 元件

    雙擊 HelloGenJMS->Assembly Diagram,在開啟的 Assembly Diagram Editor 裡建立如下元件:


    圖 5. HelloGenJMS 組裝關係圖
    組裝關係圖

    其中 Stand-alone References 是一個獨立引用,客戶通過網頁操作可以輸入個人資訊,並獲得 getInput 元件提供的服務;getInput 是一個 Java 元件,它將實現介面 IHello 裡的方法,完成記錄客戶資訊,並請求後臺服務的功能; GenericJMSImport 是一個匯入元件,它是後臺服務在 SCA 模組中的代表,它將把來自 getInput 元件的請求以及客戶資訊傳遞給後臺應用。

    實現介面方法

    雙擊圖 5 中的 getInput 元件,並選擇預設選項,系統會在文字編輯器中開啟 java 類 getInputImpl,該類提供了介面中詳細說明的所有方法的基本框架。在我們的簡單示例中,這意味著我們僅使用 hello 方法和 getMyService,locateService_IHelloPartner 方法返回類例項。

    使用下面部分中給出的程式碼替換 hello 方法:


    清單 1. getInputImpl 中的 hello 方法

    public void hello(DataObject customerInfo) {
    //TODO Needs to be implemented.
    String name = customerInfo.getString("first_name")+" "+
                  customerInfo.getString("last_name");
    System.out.println("Hello, " + name);
    Service service = (Service)ServiceManager.INSTANCE.locateService("IHelloPartner");
    service.invokeAsync("hello", customerInfo);
    }
    

    配置 Generic JMS 繫結

    右鍵單擊圖 5 裡的 GenericJMSImport 元件,選擇 Generate Binding->Messaging Binding->Generic JMS Binding,如下圖所示:


    圖 6. 建立 Generic JMS 繫結
    建立 Generic JMS 繫結

    Generic JMS 匯入服務的配置頁面被自動開啟,在此頁面配置連線工廠 (connection factory),目的地 (Destination) 等 JMS 資源,選擇資料繫結 (Data binding) 和函式選擇器 (Function selector)。目的地用於接收請求訊息;連線工廠用於連線到 JMS 提供者(在此例中為 Oracle AQ)和訪問目的地;資料繫結用於 WPS 內部資料物件與 JMS 訊息之間的格式轉換;函式選擇器將事件方法對映到介面方法。配置如下:


    圖 7. 配置 JMS 資源
    配置 JMS 資源

    建立 Web 專案

    開啟 J2EE 透檢視,在左邊的 Project Explorer 裡可以看到自動建立的 HelloGenJMSWeb 專案,在這個 Web 專案下建立本例的 Web 入口。

    1. 右鍵單擊 WebContent, NEW->JSP;
    2. 輸入 JSP 名字 TestInput.jsp,此頁面用於輸入使用者資訊,並請求 SCA 元件的服務。保持預設設定,Finish;
    3. 使用下面部分的程式碼替換 TestInput.jsp 原始碼:

      清單 2. TestInput.jsp 原始碼
      
      
      
      HelloGenJMS: Input
      
       
       
      Enter Your first name   last name  
      Email address  
      "); } }catch(Exception e){ } %>

    4. 右鍵單擊 WebContent, NEW-> JSP;
    5. 輸入 JSP 名字 TestOutput.jsp,此頁面用於顯示從 Oracle AQ 佇列中接收的訊息。保持預設設定,Finish;
    6. 使用下面部分的程式碼替換 TestOutput.jsp 原始碼:

      清單 3. TestOutput.jsp 原始碼
      
      
      
      
      
      
      
      HelloGenJMS: Output
      
      
      

      Output message

      "); receiver.close(); session1.close(); out.println("Operation Timed out
      "); } else if (receivedMessage instanceof TextMessage) { session1.close(); String resp = ((TextMessage) receivedMessage).getText(); System.out.println("Custom's information as bellow:"); System.out.println(resp); System.out.println("Custom BO had transformed into XML format successfully!"); out.println(resp+"
      "); } else { out.println("The message retrieved has to be TextMessage type"); } }catch(NamingException ne){ ne.printStackTrace(System.out); }catch(Exception e){ if(e instanceof JMSException){ ((JMSException) e).getLinkedException().printStackTrace(System.out); } } %>

    現在可以將 HelloGenJMS 專案匯出到 .ear 檔案 HelloGenJMSApp.ear 中,並從管理控制檯安裝該檔案。

    部署業務應用

    Oracle AQ 資源配置

    註冊資料庫例項 oradb 到 OID (Oracle Internet Directory),指定註冊使用者名稱 DN(cn=orcladmin) 和密碼。

    建立名為 ASGUEST 的全域性方案 (Schemas),並且給它賦予可以建立會話的許可權。步驟如下,開啟 SQL plus 視窗,以 sysdba 身份登陸,執行如下命令:

    CREATE USER ASGUEST IDENTIFIED GLOBALLY AS '';

    GRANT CREATE SESSION, resource TO ASGUEST;

    註冊連線工廠到 OID,這裡我們使用 Oracle AQ JMS 自身提供的應用程式介面來實現,詳細實現程式見清單 4,然後我們用 javac 命令對其進行編譯,java 命令執行它即可。

    USER ASGUEST IDENTIFIED GLOBALLY AS '';

    GRANT CREATE SESSION, resource TO ASGUEST;


    清單 4. 註冊連線工廠詳細程式碼

    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Hashtable;
    import java.util.Properties;
    import javax.jms.*;
    import javax.naming.*;
    import javax.naming.directory.*;
    import oracle.jms.*;
    public class CreateAQ{
    public static void main(String[] args){
     createCF();
     }
     private static void createCF(){
     /*
     * register queue connection factory for database "oradb", host
    * "9.125.63.86", port 1521, driver "thin"
    */
    String url = "jdbc:oracle:thin:@9.125.63.86:1521:oradb";
    java.sql.Connection db_conn;
    // To set username and password
    Properties prop = new Properties();
    prop.put("user", "orcladmin");
    prop.put("password", "staf4pat");
     // register connection factory by using JMS API
    try {
    	Class.forName("oracle.jdbc.OracleDriver");
    	db_conn = DriverManager.getConnection(url, prop);
     System.out.println("-----connect successfully-----"+db_conn);
    	// Type: queue, Connection Factory's name: queue_cf
    	AQjmsFactory.registerConnectionFactory(db_conn, "queue_cf", url,
    	prop, "queue"); 
    	} catch (SQLException e) {
    		e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    		e.printStackTrace();
    		} catch (JMSException e) {
    			e.printStackTrace();
    			}
     }
    }
    

    這樣我們就在 Oracle 資料庫 oradb 上成功建立了一個名為 queue_cf 的連線工廠。

    :要成功編譯執行此程式,類路徑中必須包含必要的 Oracle 和 JMS 的相關類。

    建立佇列表,開啟一個 SQL plus 視窗,以註冊使用者名稱 (orcladmin) 登陸,建立佇列表,命令如下:

    connect orcladmin/;

    EXEC DBMS_AQADM.CREATE_QUEUE_TABLE(queue_table => 'Q_TextMsg_Table',queue_payload_type =>'SYS.AQ$_JMS_TEXT_MESSAGE');

    在已知佇列表上建立佇列並啟動該佇列,命令如下:

    EXEC DBMS_AQADM.CREATE_QUEUE(queue_name => 'q01', queue_table => ' Q_TextMsg_Table ');

    EXEC DBMS_AQADM.START_QUEUE(queue_name => 'q01');

    WPS 資源配置

    新建 JMS 提供程式,進入管理控制檯,在導航窗格中,單擊資源 -> JMS -> JMS 提供程式,在內容窗格中指定作用域為:節點 =ndtest2Node01,單擊新建,詳細配置如圖 8。


    圖 8. JMS 提供程式
    JMS 提供程式

    配置 JMS 連線工廠,進入管理控制檯,在導航窗格中,單擊資源 -> JMS -> 連線工廠,在內容窗格中指定作用域為:節點 =ndtest2Node01,單擊新建,選擇 JMS 資源提供程式,確定 Oracle AQ 提供程式被選中,單擊確定,連線工廠的詳細配置如圖 9。


    圖 9. JMS 連線工廠

    配置 JMS 佇列,進入管理控制檯,在導航窗格中,單擊資源 -> JMS -> 佇列,在內容窗格中指定作用域為:節點 =ndtest2Node01,單擊新建,選擇 JMS 資源提供程式,確定 Oracle AQ 提供程式被選中,單擊確定,佇列的詳細配置資訊如圖 10。


    圖 10. 佇列配置

    應用程式部署

    進入管理控制檯,在導航窗格中,單擊應用程式 -〉企業應用程式,在內容窗格中,單擊安裝按鈕。在本地瀏覽系統右側單擊瀏覽,指定將要安裝目標檔案 (HelloGenJMSApp.ear),開啟,單擊下一步,直至完成。安裝完成後,單擊安裝頁面下部的儲存按鈕,確保安裝資訊儲存到主配置。儲存後系統自動跳轉到企業應用程式瀏覽頁面,在這裡我們可以啟動 / 停止我們選中的應用,這樣我們的配置與部署工作全部完成。

    測試一下剛剛部署的應用程式。開啟瀏覽器,鍵入 URL:http://localhost:9080/HelloGenJMSWeb/TestInput.jsp,此時我們可得到應用程式的輸入介面,根據提示鍵入相應值,如下圖所示。


    圖 11. 輸入介面
    輸入介面

    單擊 submit 按鈕,提交請求。然後我們呼叫 URL:http://localhost:9080/HelloGenJMSWeb/TestOutput.jsp 得到輸出介面。


    圖 12. 輸出介面
    輸出介面

    以上輸出證明我們的應用執行正常,同時我們也可在 SystemOut.log 中可以看到相應輸出日誌,見清單 5。


    清單 5. 輸出日誌

    [12/31/08 3:59:23:125 CST] 0000003d SystemOut O Hello, WebSphere Process Server
    [12/31/08 3:59:37:562 CST] 00000037 SystemOut O Custom's information as bellow:
    [12/31/08 3:59:37:562 CST] 00000037 SystemOut O 
    
     WebSphere Process Server
     wps@ibm.com.cn
    
    [12/31/08 3:59:37:562 CST] 00000037 SystemOut O Custom BO had transformed into 
    XML format successfully!
    

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14780828/viewspace-594429/,如需轉載,請註明出處,否則將追究法律責任。

相關文章