rednight

          0x2B|~0x2B,That's not a question,Just do it.
          posts - 32, comments - 14, trackbacks - 0, articles - 0

          導(dǎo)航

          <2006年9月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿(1)

          隨筆分類(lèi)

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          WLS 9.1與MQ v5.3 通過(guò)JMS Bridge通信配置

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

            最近參與一個(gè)系統(tǒng)的原型開(kāi)發(fā),原型要求演示W(wǎng)ebLogic Server9.1與其他第三方產(chǎn)品的通信支持,包括與IBM MQSeries的雙向交互、與Tuxedo的雙向交互、支持與.NET的通過(guò)Web Service交互等。我負(fù)責(zé)完成與IBM MQSeries的雙向交互這部分,在網(wǎng)上找了不少文章,發(fā)現(xiàn)其中基本都是基于WebLogic Server 8.1實(shí)現(xiàn)的。因?yàn)閃ebLogic Server 9.1在JMS上有很大的增強(qiáng),所以我參考以前的文章,自己實(shí)現(xiàn)了WebLogic Server 9.1與IBM MQSeries 5.3的雙向交互并且進(jìn)行了測(cè)試。想必很多同行會(huì)遇到跟我一樣的問(wèn)題,特此撰文一片跟大家分享。本文配置在window xp上測(cè)試成功。

          概述

            目標(biāo)是實(shí)現(xiàn)WebLogic Server 9.1和IBM MQSeries5.3之間的的雙向交互,包括:

          • WebLogic Server 9.1消息轉(zhuǎn)發(fā)給IBM MQSeries5.3
          • IBM MQSeries 5.3消息轉(zhuǎn)發(fā)給WebLogic Server 9.1

            具體地,將WebLogic Server9.1隊(duì)列WLSSendQueue的消息轉(zhuǎn)發(fā)到IBM MQSeries 5.3隊(duì)列MQReceiveQueue,同時(shí)將IBM MQSeries 5.3隊(duì)列MQSendQueue的消息轉(zhuǎn)發(fā)到WebLogic Server 9.1隊(duì)列WLSSendQueue。

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

          • 通過(guò)WebLogic控制臺(tái)建立兩個(gè)WebLogic隊(duì)列:發(fā)送隊(duì)列WLSSendQueue和接收隊(duì)列WLSReceiveQueue。
          • 類(lèi)似地,通過(guò)MQ資源管理器建立兩個(gè)MQ本地隊(duì)列:發(fā)送隊(duì)列MQSendQueue和接收隊(duì)列MQReceiveQueue。
          • 為 了實(shí)現(xiàn)消息轉(zhuǎn)發(fā)需要建立兩個(gè)Messaging Bridge:WLS2MQBridge 和MQ2WLSBridge 。WLS2MQBridge:將WebLogic發(fā)送隊(duì)列WLSSendQueue的消息轉(zhuǎn)發(fā)到MQ接收隊(duì)列MQReceiveQueue; MQ2WLSBridge:將MQ發(fā)送隊(duì)列MQSendQueue的消息轉(zhuǎn)發(fā)到WebLogic接收隊(duì)列WLSReceiveQueue。
          • 為 了實(shí)現(xiàn)事務(wù)性消息轉(zhuǎn)發(fā), WebLogic需要使用XAQueueConnectionFactory,而MQ需要使用MQXAQueueConnectionFactory。這 就確定了WebLogic需要使用支持XA的連接工廠,MQ必須采用綁定的模式,并且WebLogic和MQ必須安裝在同一臺(tái)機(jī)器上。

          WLS配置

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

          • 自動(dòng)化的 JMS 故障恢復(fù)

              自動(dòng)化的JMS故障恢復(fù)是業(yè)內(nèi)期待已久的特性。JMS利用“Automatic WebLogic Server Migration”特性來(lái)提供自動(dòng)化的JMS故障恢復(fù)。在整個(gè)WebLogic Server實(shí)例進(jìn)行故障恢復(fù)時(shí),JMS也將自動(dòng)從故障中恢復(fù)過(guò)來(lái)。盡管其他的一些JMS服務(wù)器提供商已經(jīng)利用一些復(fù)雜裝置提供了這樣的功能,但 WebLogic 9.1的實(shí)現(xiàn)是最直觀而清晰的。

          • 排序單元

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

            圖1

          • 存儲(chǔ)轉(zhuǎn)發(fā) (SAF)

              WebLogic存儲(chǔ)轉(zhuǎn)發(fā)(store and forward, SAF)服務(wù)使WebLogic Server能在通過(guò)WebLogic Server實(shí)例部署的應(yīng)用程序間可靠地交付信息。SAF的強(qiáng)大功能使得我們可以很容易地將多個(gè)消息服務(wù)鏈接在一起(如圖2所示)。

            圖2

          • Messaging Bridge具有如下優(yōu)點(diǎn):
            • 不需要編碼,純配置,加速你的開(kāi)發(fā);
            • 靈活的體系結(jié)構(gòu),容易配置多個(gè)Messaging Bridges,并且而且可以動(dòng)態(tài)的啟動(dòng)和停止單個(gè)Messaging Bridge;
            • 采用即取即用的MQ 適配器,實(shí)現(xiàn)全面的MQ JMS 支持,能夠設(shè)定MQ 主題查詢(xún);
            • 充分利用WebLogic容器進(jìn)行服務(wù)管理,并且集中所有的Bridges資源在一個(gè)線程池;
            • 全面的事務(wù)處理能力,兩階段事務(wù)處理;
            • 全面的JCA 支持;
            • 確保服務(wù)質(zhì)量和連接管理,實(shí)實(shí)在在的一次性服務(wù);
            • 控制臺(tái)監(jiān)視能力;
            • 集成BEA WebLogic應(yīng)用與外部消息提供商,以便將新的應(yīng)用與現(xiàn)有的投資連接起來(lái)。

          創(chuàng)建Server域

            創(chuàng)建Server Domain, domain名稱(chēng)jms_domain

          修改啟動(dòng)文件

            修改WebLogic的啟動(dòng)文件startWebLogic.cmd。將IBM MQSeries和IBM MQSeries Java的安裝目錄加到WebLogic path下,同時(shí)將MQ JMS Java類(lèi)包加入到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的連接工廠和隊(duì)列要到JMS Modules下面設(shè)置:

          • 創(chuàng)建文件后備存儲(chǔ)BridgeFileStore
          • 創(chuàng)建JMS服務(wù)器BridgeJMSServer,和Paging Store設(shè)為" BridgeFileStore" ,Target為adminServer
          • 創(chuàng)建支持XA的連接工廠WLSCFXA,JNDI Name為bridge.wlsCFXA
          • 創(chuàng)建JMS發(fā)送隊(duì)列WLSSendQueue,JNDI名稱(chēng)為bridge.wlsSendQueue,Target為BridgeJMSServer
          • 創(chuàng)建JMS接收隊(duì)列WLSReceiveQueue,JNDI名稱(chēng)為bridge.wlsReceiveQueue,Target為BridgeJMSServer

          配置Messaging Bridge Destination

          • JMS Bridge Destination名稱(chēng)為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名稱(chēng)為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名稱(chēng)為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(域配置時(shí)指定的)
            • User Password: weblogic(域配置時(shí)指定的)
          • JMS Bridge Destination名稱(chēng)為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(域配置時(shí)指定的)
            • User Password: weblogic(域配置時(shí)指定的)

          配置Messaging Bridge

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

          MQ 配置

            IBM MQSeries是IBM的商業(yè)通訊中間件(Commercial Messaging Middleware)。IBM MQSeries提供一個(gè)具有工業(yè)標(biāo)準(zhǔn),安全,可靠的信息傳輸系統(tǒng)。它的功能是控制和管理一個(gè)集成的商業(yè)應(yīng)用,使得組成這個(gè)商業(yè)應(yīng)用的多個(gè)分支程序(模塊)之間通過(guò)傳遞信息完成整個(gè)工作流程。IBM MQSeries具有特殊的技術(shù)防止信息重復(fù)傳送,確保信息一次且僅一次(once-and-only-once)傳遞,保證傳輸?shù)目煽啃浴1疚氖褂玫?MQ版本為IBM MQSeries 5.3。

            IBM MQSeries基本由一個(gè)消息傳輸系統(tǒng)和一個(gè)應(yīng)用程序接口組成,其資源是消息和隊(duì)列(Messaging and Queuing)。

            隊(duì)列管理器(Queue Manager):管理隊(duì)列的系統(tǒng),實(shí)現(xiàn)網(wǎng)絡(luò)通信,保證消息安全可靠地傳輸?shù)侥康牡亍S糜诖_保隊(duì)列之間的信息提供,包括網(wǎng)絡(luò)中不同系統(tǒng)上的的遠(yuǎn)程隊(duì)列之間的信息提供。并保證網(wǎng)絡(luò)故障或關(guān)閉后的恢復(fù)。

            隊(duì)列:一個(gè)安全的信息存儲(chǔ)區(qū)。因?yàn)樾畔⒋娣旁陉?duì)列中,所以應(yīng)用程序可以相互獨(dú)立的運(yùn)行,以不同的速度,在不同的時(shí)間,在不同的地點(diǎn)。

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

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

            傳輸隊(duì)列:它是一個(gè)本地隊(duì)列,保存了指定要發(fā)送到遠(yuǎn)端的消息。

            死信隊(duì)列:它是一個(gè)本地隊(duì)列,用于存放無(wú)法傳遞的消息。

            通道:在兩個(gè)隊(duì)列管理器之間建立起來(lái)的數(shù)據(jù)傳輸鏈路。

            應(yīng)用程序接口:應(yīng)用程序和信息系統(tǒng)之間通過(guò)MQSeries API實(shí)現(xiàn)的接口。

          Install MQ

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

            (缺省安裝未包含)

          Install MQ

          確認(rèn)MQ服務(wù)已啟動(dòng)。

            可通過(guò)MicroSoft windows控制面板中管理工具下的服務(wù)控制臺(tái)確認(rèn)。如下圖:

          確認(rèn)MQ服務(wù)已啟動(dòng)

          從程序菜單啟動(dòng)MQ 資源管理器

            如果程序提示試用版過(guò)期,可以通過(guò)修改系統(tǒng)時(shí)間搞定.我就是修改到了2004年。

          通過(guò)MQ資源管理器創(chuàng)建一個(gè)通道

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

          通過(guò)MQ資源管理器創(chuàng)建一個(gè)通道

          通過(guò)MQ資源管理器創(chuàng)建兩個(gè)本地隊(duì)列

            建立兩個(gè)本地隊(duì)名為MQReceiveQueue, MQSendQueue,其他參數(shù)缺省設(shè)置。

          通過(guò)MQ資源管理器創(chuàng)建兩個(gè)本地隊(duì)列

          更新MQ安裝目錄下與JMS配置相關(guān)的文件

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

            使用Sun的文件JNDI服務(wù)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,此文件用于啟動(dòng)MQ的JMS命令行管理界面,要設(shè)置啟動(dòng)JMS命令行管理界面所需環(huán)境變量。在JMSAdmin.bat中添加如下環(huán)境變量:
          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
          

          進(jìn)入MQ的JMS命令行管理界面綁定MQ的JMS Factory以及JMS本地隊(duì)列

          • 開(kāi)啟MicroSoft Windows的Dos窗口(cmd.exe)
          • 進(jìn)入MQ安裝目錄下的java目錄下的bin目錄
          • 運(yùn)行JMSAdmin.bat并通過(guò)-cfg參數(shù)指定JMSAdmin.config文件位置

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

            進(jìn)入MQ的JMS命令行管理界面綁定MQ的JMS Factory以及JMS本地隊(duì)列

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

          測(cè)試

          MQ發(fā)送,WLS接收

          1. MQ發(fā)送隊(duì)列放入測(cè)試消息

            MQ發(fā)送隊(duì)列放入測(cè)試消息

          2. 在WLS控制臺(tái)監(jiān)測(cè)消息到達(dá)

            在WLS控制臺(tái)監(jiān)測(cè)消息到達(dá)

          WLS發(fā)送,MQ接收

          1. WLS發(fā)送隊(duì)列放入測(cè)試消息

              執(zhí)行下面的代碼,給WLS發(fā)送隊(duì)列放入測(cè)試消息

              ?

            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 通過(guò)JMS Message Bridge通信配置,陳仁祥
            http://e-docs.bea.com/wls/docs91/messaging.html

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 万宁市| 石阡县| 阳东县| 天津市| 虹口区| 昌宁县| 永定县| 通渭县| 嘉定区| 仁布县| 科技| 乌兰察布市| 饶阳县| 慈溪市| 罗田县| 玉林市| 桂平市| 金阳县| 云南省| 通海县| 太和县| 长兴县| 东丽区| 夹江县| 江西省| 银川市| 北碚区| 崇阳县| 阿巴嘎旗| 青河县| 荔浦县| 牙克石市| 盐山县| 萨迦县| 泰安市| 岗巴县| 灵寿县| 漠河县| 辉县市| 都江堰市| 宽甸|