rednight

          0x2B|~0x2B,That's not a question,Just do it.
          posts - 32, comments - 14, trackbacks - 0, articles - 0
          WLS 9.1與MQ v5.3 通過JMS Bridge通信配置

          時間:2006-06-27
          作者:孟和
          瀏覽次數: 1229
          本文關鍵字:WebLogic,?MQ,?JMS,?MQSeries,?JMS Bridge
          文章工具
          推薦給朋友?推薦給朋友
          打印文章?打印文章

            最近參與一個系統的原型開發,原型要求演示WebLogic Server9.1與其他第三方產品的通信支持,包括與IBM MQSeries的雙向交互、與Tuxedo的雙向交互、支持與.NET的通過Web Service交互等。我負責完成與IBM MQSeries的雙向交互這部分,在網上找了不少文章,發現其中基本都是基于WebLogic Server 8.1實現的。因為WebLogic Server 9.1在JMS上有很大的增強,所以我參考以前的文章,自己實現了WebLogic Server 9.1與IBM MQSeries 5.3的雙向交互并且進行了測試。想必很多同行會遇到跟我一樣的問題,特此撰文一片跟大家分享。本文配置在window xp上測試成功。

          概述

            目標是實現WebLogic Server 9.1和IBM MQSeries5.3之間的的雙向交互,包括:

          • WebLogic Server 9.1消息轉發給IBM MQSeries5.3
          • IBM MQSeries 5.3消息轉發給WebLogic Server 9.1

            具體地,將WebLogic Server9.1隊列WLSSendQueue的消息轉發到IBM MQSeries 5.3隊列MQReceiveQueue,同時將IBM MQSeries 5.3隊列MQSendQueue的消息轉發到WebLogic Server 9.1隊列WLSSendQueue。

            WebLogic Server包含一個完整的、有豐富特性的消息服務器。第三方的消息服務器(如IBM MQSeries),只要其提供了JMS API的實現,也可以在其中運行。Messaging Bridge是一種由WebLogic Server提供的J2EE設備,用于轉發兩個消息提供者的消息。你可以使用Messaging Bridge將消息從一個消息提供者的目的地(隊列或者主題)移至另外一個消息提供者的目的地。因此,當WebLogic應用程序需要與第三方消息提供者 (比如IBM MQSeries)進行交互時,Messaging Bridge就可以承擔這個中間角色。我們需要做如下配置:

          • 通過WebLogic控制臺建立兩個WebLogic隊列:發送隊列WLSSendQueue和接收隊列WLSReceiveQueue。
          • 類似地,通過MQ資源管理器建立兩個MQ本地隊列:發送隊列MQSendQueue和接收隊列MQReceiveQueue。
          • 為 了實現消息轉發需要建立兩個Messaging Bridge:WLS2MQBridge 和MQ2WLSBridge 。WLS2MQBridge:將WebLogic發送隊列WLSSendQueue的消息轉發到MQ接收隊列MQReceiveQueue; MQ2WLSBridge:將MQ發送隊列MQSendQueue的消息轉發到WebLogic接收隊列WLSReceiveQueue。
          • 為 了實現事務性消息轉發, WebLogic需要使用XAQueueConnectionFactory,而MQ需要使用MQXAQueueConnectionFactory。這 就確定了WebLogic需要使用支持XA的連接工廠,MQ必須采用綁定的模式,并且WebLogic和MQ必須安裝在同一臺機器上。

          WLS配置

            WebLogic Server 9.1在WebLogic JMS的配置、部署和動態管理方面引入了重要的改進。它對JMS 1.1規范提供官方支持。此外,在系統中添加了人們期待已久的消息排序高級特性。XML API的XML消息處理功能得到了增強。在WebLogic 9.1平臺上使用JMS非常輕松有趣、可靠且迅速。下面是現有新特性中的一些亮點。

          • 自動化的 JMS 故障恢復

              自動化的JMS故障恢復是業內期待已久的特性。JMS利用“Automatic WebLogic Server Migration”特性來提供自動化的JMS故障恢復。在整個WebLogic Server實例進行故障恢復時,JMS也將自動從故障中恢復過來。盡管其他的一些JMS服務器提供商已經利用一些復雜裝置提供了這樣的功能,但 WebLogic 9.1的實現是最直觀而清晰的。

          • 排序單元

              消息排序是大多數消息處理應用程序的一項基本要求。WebLogic Server JMS即使在集群環境中也能確保消息的順序處理。它甚至可以定義多個組來將消息分組,這樣每個組都擁有自己的處理順序(如圖1所示)。

            圖1

          • 存儲轉發 (SAF)

              WebLogic存儲轉發(store and forward, SAF)服務使WebLogic Server能在通過WebLogic Server實例部署的應用程序間可靠地交付信息。SAF的強大功能使得我們可以很容易地將多個消息服務鏈接在一起(如圖2所示)。

            圖2

          • Messaging Bridge具有如下優點:
            • 不需要編碼,純配置,加速你的開發;
            • 靈活的體系結構,容易配置多個Messaging Bridges,并且而且可以動態的啟動和停止單個Messaging Bridge;
            • 采用即取即用的MQ 適配器,實現全面的MQ JMS 支持,能夠設定MQ 主題查詢;
            • 充分利用WebLogic容器進行服務管理,并且集中所有的Bridges資源在一個線程池;
            • 全面的事務處理能力,兩階段事務處理;
            • 全面的JCA 支持;
            • 確保服務質量和連接管理,實實在在的一次性服務;
            • 控制臺監視能力;
            • 集成BEA WebLogic應用與外部消息提供商,以便將新的應用與現有的投資連接起來。

          創建Server域

            創建Server Domain, domain名稱jms_domain

          修改啟動文件

            修改WebLogic的啟動文件startWebLogic.cmd。將IBM MQSeries和IBM MQSeries Java的安裝目錄加到WebLogic path下,同時將MQ JMS Java類包加入到WebLogic classpath下:

          @rem added the following to configure messaging bridge with local MQSeries installation
          set MQ_INSTALL_PATH=D:\installed\MQ
          set MQ_JAVA_INSTALL_PATH=D:\installed\MQ\Java
          set MQ_JAVA_LIB=%MQ_JAVA_INSTALL_PATH%\lib
          set MQ_CLASSPATH=%MQ_JAVA_LIB%\com.ibm.mq.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\com.ibm.mqbind.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\com.ibm.mqjms.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\fscontext.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\jms.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\jndi.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\jta.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\ldap.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\providerutil.jar
          
          set MQ_PATH=%MQ_INSTALL_PATH%\in;%MQ_JAVA_INSTALL_PATH%\in;
                 %MQ_JAVA_INSTALL_PATH%\lib
          set PATH=%MQ_PATH%;%PATH%
          set CLASSPATH=%MQ_CLASSPATH%;%WEBLOGIC_CLASSPATH%;
                 %POINTBASE_CLASSPATH%;%JAVA_HOME%\jre\lib\rt.jar;
                %WL_HOME%\server\lib\webservices.jar;%CLASSPATH%
          

          配置JMS

            注意WLS91的連接工廠和隊列要到JMS Modules下面設置:

          • 創建文件后備存儲BridgeFileStore
          • 創建JMS服務器BridgeJMSServer,和Paging Store設為" BridgeFileStore" ,Target為adminServer
          • 創建支持XA的連接工廠WLSCFXA,JNDI Name為bridge.wlsCFXA
          • 創建JMS發送隊列WLSSendQueue,JNDI名稱為bridge.wlsSendQueue,Target為BridgeJMSServer
          • 創建JMS接收隊列WLSReceiveQueue,JNDI名稱為bridge.wlsReceiveQueue,Target為BridgeJMSServer

          配置Messaging Bridge Destination

          • JMS Bridge Destination名稱為MQReceiveBridgeDestination
            • Adapter JNDI Name: eis.jms.WLSConnectionFactoryJNDIXA
            • Connection URL為file:/D:/installed/MQ/Queues,
            • Initial Context Factory為com.sun.jndi.fscontext.RefFSContextFactory,
            • Connection Factory JNDI Name為bridge.mqQCFXA,
            • Destination JNDI Name為bridge.mqReceiveQueue
            • Destination Type: Queue
          • JMS Bridge Destination名稱為MQSendBridgeDestination
            • Adapter JNDI Name: eis.jms.WLSConnectionFactoryJNDIXA
            • Connection URL為file:/D:/installed/MQ/Queues,
            • Initial Context Factory為com.sun.jndi.fscontext.RefFSContextFactory,
            • Connection Factory JNDI Name為bridge.mqQCFXA,
            • Destination JNDI Name為bridge.mqSendQueue
            • Destination Type: Queue
          • JMS Bridge Destination名稱為WLSReceiveBridgeDestination
            • Adapter JNDI Name: eis.jms.WLSConnectionFactoryJNDIXA
            • Connection URL為t3://localhost:7001,
            • Initial Context Factory為weblogic.jndi.WLInitialContextFactory,
            • Connection Factory JNDI Name為bridge.wlsCFXA,
            • Destination JNDI Name為bridge.wlsReceiveQueue
            • Destination Type: Queue
            • User Name: weblogic(域配置時指定的)
            • User Password: weblogic(域配置時指定的)
          • JMS Bridge Destination名稱為WLSSendBridgeDestination
            • Adapter JNDI Name: eis.jms.WLSConnectionFactoryJNDIXA
            • Connection URL為t3://localhost:7001,
            • Initial Context Factory為weblogic.jndi.WLInitialContextFactory,
            • Connection Factory JNDI Name為bridge.wlsCFXA,
            • Destination JNDI Name為bridge.wlsSendQueue,
            • Destination Type: Queue
            • User Name: weblogic(域配置時指定的)
            • User Password: weblogic(域配置時指定的)

          配置Messaging Bridge

          • JMS Bridge名稱為MQ2WLSBridge
            • Source Bridge Destination:  MQSendBridgeDestination
            • Target Bridge Destination:  WLSReceiveBridgeDestination
            • Quality Of Service:      Exactly-Once
            • Started:            Yes
          • JMS Bridge名稱為WLS2MQBridge
            • Source Bridge Destination:  WLSSendBridgeDestination
            • Target Bridge Destination:  MQReceiveBridgeDestination
            • Quality Of Service:      Exactly-Once
            • Started:            Yes

          MQ 配置

            IBM MQSeries是IBM的商業通訊中間件(Commercial Messaging Middleware)。IBM MQSeries提供一個具有工業標準,安全,可靠的信息傳輸系統。它的功能是控制和管理一個集成的商業應用,使得組成這個商業應用的多個分支程序(模塊)之間通過傳遞信息完成整個工作流程。IBM MQSeries具有特殊的技術防止信息重復傳送,確保信息一次且僅一次(once-and-only-once)傳遞,保證傳輸的可靠性。本文使用的 MQ版本為IBM MQSeries 5.3。

            IBM MQSeries基本由一個消息傳輸系統和一個應用程序接口組成,其資源是消息和隊列(Messaging and Queuing)。

            隊列管理器(Queue Manager):管理隊列的系統,實現網絡通信,保證消息安全可靠地傳輸到目的地。用于確保隊列之間的信息提供,包括網絡中不同系統上的的遠程隊列之間的信息提供。并保證網絡故障或關閉后的恢復。

            隊列:一個安全的信息存儲區。因為信息存放在隊列中,所以應用程序可以相互獨立的運行,以不同的速度,在不同的時間,在不同的地點。

            本地隊列:對程序而言,本地隊列屬于該程序所連接的隊列管理器。

            遠程隊列:該隊列不屬于該程序所連接的隊列管理器,而只是遠端隊列管理器的隊列在本地的定義。

            傳輸隊列:它是一個本地隊列,保存了指定要發送到遠端的消息。

            死信隊列:它是一個本地隊列,用于存放無法傳遞的消息。

            通道:在兩個隊列管理器之間建立起來的數據傳輸鏈路。

            應用程序接口:應用程序和信息系統之間通過MQSeries API實現的接口。

          Install MQ

          • 安裝過程中選擇自定義安裝模式,并確保安裝JMS所需的Java jar包支持如下圖:

            (缺省安裝未包含)

          Install MQ

          確認MQ服務已啟動。

            可通過MicroSoft windows控制面板中管理工具下的服務控制臺確認。如下圖:

          確認MQ服務已啟動

          從程序菜單啟動MQ 資源管理器

            如果程序提示試用版過期,可以通過修改系統時間搞定.我就是修改到了2004年。

          通過MQ資源管理器創建一個通道

            建立名為BRIDGE.CHANNEL的通道,其他參數缺省設置。

          通過MQ資源管理器創建一個通道

          通過MQ資源管理器創建兩個本地隊列

            建立兩個本地隊名為MQReceiveQueue, MQSendQueue,其他參數缺省設置。

          通過MQ資源管理器創建兩個本地隊列

          更新MQ安裝目錄下與JMS配置相關的文件

            JMSAdmin.config文件位于%MQ_INSTALLL_HOME_PATH%\Java\bin,主要定義JNDI服務的提供商,即JMS Server Factory和URL。%MQ_INSTALLL_HOME_PATH%\Java\bin目錄下新建目錄bridgeconfig,將JMSAdmin.config文件拷貝到bridgeconfig。

            使用Sun的文件JNDI服務Factory,故定義

            ?

          INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextFactory
          PROVIDER_URL=file:/D:/installed/MQ/Queues
          SECURITY_AUTHENTICATION=none
          (例子中,MQ安裝目錄%MQ_INSTALLL_HOME_PATH%為:D:/installed/MQ/)
          JMSAdmin.bat文件也位于%MQ_INSTALLL_HOME_PATH%\Java\bin,此文件用于啟動MQ的JMS命令行管理界面,要設置啟動JMS命令行管理界面所需環境變量。在JMSAdmin.bat中添加如下環境變量:
          set MQ_JAVA_INSTALL_PATH=D:\installed\MQ\Java
          set MQ_JAVA_LIB=%MQ_JAVA_INSTALL_PATH%lib
          set MQ_CLASSPATH=%MQ_JAVA_LIB%com.ibm.mq.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%com.ibm.mqbind.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%com.ibm.mqjms.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%fscontext.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%jms.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%jta.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%ldap.jar
          set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%providerutil.jar
          

          進入MQ的JMS命令行管理界面綁定MQ的JMS Factory以及JMS本地隊列

          • 開啟MicroSoft Windows的Dos窗口(cmd.exe)
          • 進入MQ安裝目錄下的java目錄下的bin目錄
          • 運行JMSAdmin.bat并通過-cfg參數指定JMSAdmin.config文件位置

              本次例子中輸入:D:\ installed\MQ\Java\bin>jmsadmin -cfg? .\bridgeconfig\jmsadmin.config

            進入MQ的JMS命令行管理界面綁定MQ的JMS Factory以及JMS本地隊列

          • 如上圖所示界面,生成一個MQXAQueueConnectionFactory對象,Messaging Bridge將使用這個工廠對象建立MQ的XA連接,使用命令DEFINE XAQCF,起名:bridge.mqQCFXA。
          • 生成JMSQueue對象來綁定MQ隊列MQReceiveQueue。
          • 生成JMSQueue對象來綁定MQ隊列MQSendQueue。
          • 使用dis ctx命令,查看目前已有的對象和綁定,可以看到XA連接工廠和隊列都已綁定。

          測試

          MQ發送,WLS接收

          1. MQ發送隊列放入測試消息

            MQ發送隊列放入測試消息

          2. 在WLS控制臺監測消息到達

            在WLS控制臺監測消息到達

          WLS發送,MQ接收

          1. WLS發送隊列放入測試消息

              執行下面的代碼,給WLS發送隊列放入測試消息

              ?

            package com.bea;
            import javax.naming.InitialContext;
            import javax.naming.Context;
            import javax.naming.NamingException;
            import javax.jms.*;
            import java.util.Hashtable;
            /**
             * Created by IntelliJ IDEA.
             * User: pmeng
             * Date: 2006-6-3
             * Time: 14:54:08
             */
            public class SendMessageTest {
                public static void main(String[] args) {       
                    try {
                        Hashtable env = new Hashtable();
                        env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
                        env.put(Context.PROVIDER_URL, "t3://localhost:7001");
                        InitialContext ctx = new InitialContext(env);              
                        QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("bridge.wlsCFXA");
                        QueueConnection connection = factory.createQueueConnection();
                        QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
                        Queue queue = (Queue) ctx.lookup("bridge.wlsSendQueue");
                        connection.start();
                        QueueSender queueSender = session.createSender(queue);
                        TextMessage msg = session.createTextMessage();
                        msg.setText("Menghe.");
                        queueSender.send(msg);
                    }
                    catch (NamingException e) {
                        System.out.println("NamingException:" + e.getMessage());
                        e.printStackTrace();
                    }
                    catch (JMSException e) {
                        System.out.println("JMSException:" + e.getMessage());
                        e.printStackTrace();
                    }
                }
            }
            
          2. MQ資源管理器查看接收到的消息

            MQ資源管理器查看接收到的消息

          參考資料

          1. BEA WebLogic Server 8.1 JMS與 IBM MQSeries 集成方案,周海根,
            http://dev2dev.bea.com.cn/techdoc/20040411784.html
          2. BEA WebLogic 8.1 JMS 與IBM MQ v5.3 通過JMS Message Bridge通信配置,陳仁祥
            http://e-docs.bea.com/wls/docs91/messaging.html

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 荆门市| 巴南区| 柯坪县| 克什克腾旗| 宜阳县| 于田县| 西充县| 彭阳县| 青州市| 盈江县| 博野县| 嘉禾县| 施甸县| 察哈| 黄大仙区| 陵川县| 中江县| 岗巴县| 奈曼旗| 清流县| 津市市| 栾川县| 溧水县| 满城县| 黔西县| 德阳市| 清远市| 永修县| 常州市| 天峻县| 高要市| 吉安市| 曲周县| 阳西县| 嘉义市| 闻喜县| 德格县| 沿河| 深州市| 梅河口市| 锦屏县|