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

- 存儲(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所示)。

- 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包支持如下圖:
(缺省安裝未包含)
確認(rèn)MQ服務(wù)已啟動(dòng)。
可通過(guò)MicroSoft windows控制面板中管理工具下的服務(wù)控制臺(tái)確認(rèn)。如下圖:
從程序菜單啟動(dòng)MQ 資源管理器
如果程序提示試用版過(guò)期,可以通過(guò)修改系統(tǒng)時(shí)間搞定.我就是修改到了2004年。
通過(guò)MQ資源管理器創(chuàng)建一個(gè)通道
建立名為BRIDGE.CHANNEL的通道,其他參數(shù)缺省設(shè)置。
通過(guò)MQ資源管理器創(chuàng)建兩個(gè)本地隊(duì)列
建立兩個(gè)本地隊(duì)名為MQReceiveQueue, MQSendQueue,其他參數(shù)缺省設(shè)置。
更新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ì)列
- 如上圖所示界面,生成一個(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接收
- MQ發(fā)送隊(duì)列放入測(cè)試消息

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

WLS發(fā)送,MQ接收
- 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();
}
}
}
- 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 通過(guò)JMS Message Bridge通信配置,陳仁祥
http://e-docs.bea.com/wls/docs91/messaging.html