WLS 9.1與MQ v5.3 通過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所示)。

- 存儲轉發 (SAF)
WebLogic存儲轉發(store and forward, SAF)服務使WebLogic Server能在通過WebLogic Server實例部署的應用程序間可靠地交付信息。SAF的強大功能使得我們可以很容易地將多個消息服務鏈接在一起(如圖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包支持如下圖:
(缺省安裝未包含)
確認MQ服務已啟動。
可通過MicroSoft windows控制面板中管理工具下的服務控制臺確認。如下圖:
從程序菜單啟動MQ 資源管理器
如果程序提示試用版過期,可以通過修改系統時間搞定.我就是修改到了2004年。
通過MQ資源管理器創建一個通道
建立名為BRIDGE.CHANNEL的通道,其他參數缺省設置。
通過MQ資源管理器創建兩個本地隊列
建立兩個本地隊名為MQReceiveQueue, MQSendQueue,其他參數缺省設置。
更新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本地隊列
- 如上圖所示界面,生成一個MQXAQueueConnectionFactory對象,Messaging Bridge將使用這個工廠對象建立MQ的XA連接,使用命令DEFINE XAQCF,起名:bridge.mqQCFXA。
- 生成JMSQueue對象來綁定MQ隊列MQReceiveQueue。
- 生成JMSQueue對象來綁定MQ隊列MQSendQueue。
- 使用dis ctx命令,查看目前已有的對象和綁定,可以看到XA連接工廠和隊列都已綁定。
測試
MQ發送,WLS接收
- MQ發送隊列放入測試消息

- 在WLS控制臺監測消息到達

WLS發送,MQ接收
- 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();
}
}
}
- MQ資源管理器查看接收到的消息

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