java连接ibm mq
http://blog.csdn.net/liaomin416100569/article/details/7254191
首先 打開 IBM websphere MQ 管理器 添加一個(gè)隊(duì)列管理器 名稱 叫MyTest
在隊(duì)列管理氣中的隊(duì)列文件夾下 新建一個(gè)本地隊(duì)列名稱叫?LOCALQUEUE
在高級-》通道 下新建一個(gè)服務(wù)器連接通道 名稱叫:SERVERCONN
在mytest右鍵 屬性 查看編碼字符集標(biāo)識 ?中文默認(rèn)在window下是 1381
在高級-》偵聽器下查看連接的端口 默認(rèn)是:1414
編寫代碼:
package com.mq;
import com.ibm.mq.MQC;
import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
public class TestMQ {
static MQQueueManager qMgr;
static int CCSID=1381 ;
static String queueString="LOCALQUEUE";
public static void connect() throws MQException {
MQEnvironment.hostname = "127.0.0.1";
MQEnvironment.channel = "SERVERCONN";
MQEnvironment.port = 1414;
MQEnvironment.CCSID = CCSID;
qMgr = new MQQueueManager("myTest");
}
public static void sendMsg(String msgStr){ ??
? ? ? ? int openOptions = MQC.MQOO_INPUT_AS_Q_DEF|MQC.MQOO_OUTPUT|MQC.MQOO_INQUIRE; ??
? ? ? ? MQQueue queue = null; ??
? ? ? ? try { ??
? ? ? ? ? ? //建立Q1通道的連接 ??
? ? ? ? ? ? queue = qMgr.accessQueue(queueString, openOptions, null, null,null); ? ??
? ? ? ? ? ? MQMessage msg = new MQMessage();// 要寫入隊(duì)列的消息 ??
? ? ? ? ? ? msg.format = MQC.MQFMT_STRING; ??
? ? ? ? ? ? msg.characterSet = CCSID;
? ? ? ? ? ? msg.encoding=CCSID;
? ? ? ? ? ?// msg.writeObject(msgStr); //將消息寫入消息對象中 ??
? ? ? ? ? ? msg.writeString(msgStr);
? ? ? ? ? ? MQPutMessageOptions pmo = new MQPutMessageOptions(); ??
? ? ? ? ? ? msg.expiry = -1; ? ?// 設(shè)置消息用不過期 ??
? ? ? ? ? ? queue.put(msg, pmo);// 將消息放入隊(duì)列 ??
? ? ? ? } catch (Exception e) { ??
? ? ? ? ? ? // TODO Auto-generated catch block ??
? ? ? ? ? ? e.printStackTrace(); ??
? ? ? ? }finally{ ??
? ? ? ? ? ? if(queue!=null){ ??
? ? ? ? ? ? ? ? try { ??
? ? ? ? ? ? ? ? ? ? queue.close(); ??
? ? ? ? ? ? ? ? } catch (MQException e) { ??
? ? ? ? ? ? ? ? ? ? // TODO Auto-generated catch block ??
? ? ? ? ? ? ? ? ? ? e.printStackTrace(); ??
? ? ? ? ? ? ? ? } ??
? ? ? ? ? ? } ??
? ? ? ? } ??
? ? } ??
? ? ? ?
? ? public static void receiveMsg() ??
? ? { ??
? ? ? ? int openOptions = MQC.MQOO_INPUT_AS_Q_DEF|MQC.MQOO_OUTPUT|MQC.MQOO_INQUIRE; ??
? ? ? ? MQQueue queue = null; ??
? ? ? ? try { ??
? ? ? ? ? ? queue = qMgr.accessQueue(queueString, openOptions, null, null,null); ??
? ? ? ? ? ? System.out.println("該隊(duì)列當(dāng)前的深度為:"+queue.getCurrentDepth()); ??
? ? ? ? ? ? System.out.println("==========================="); ??
? ? ? ? ? ? int depth = queue.getCurrentDepth(); ??
? ? ? ? ? ? //將隊(duì)列的里的消息讀出來 ??
? ? ? ? ? ? while(depth-->0) ??
? ? ? ? ? ? { ??
? ? ? ? ? ? ? ? MQMessage msg = new MQMessage();// 要讀的隊(duì)列的消息 ??
? ? ? ? ? ? ? ? MQGetMessageOptions gmo = new MQGetMessageOptions(); ??
? ? ? ? ? ? ? ? queue.get(msg, gmo); ??
? ? ? ? ? ? ? ? System.out.println("消息的大小為:"+msg.getDataLength()); ??
? ? ? ? ? ? ? ? System.out.println("消息的內(nèi)容:\n"+msg.readStringOfByteLength(msg.getDataLength())); ??
? ? ? ? ? ? ? ? System.out.println("---------------------------"); ??
? ? ? ? ? ? } ??
? ? ? ? } catch (Exception e) { ??
? ? ? ? ? ? // TODO Auto-generated catch block ??
? ? ? ? ? ? e.printStackTrace(); ??
? ? ? ? }finally{ ??
? ? ? ? ? ? if(queue!=null){ ??
? ? ? ? ? ? ? ? try { ??
? ? ? ? ? ? ? ? ? ? queue.close(); ??
? ? ? ? ? ? ? ? } catch (MQException e) { ??
? ? ? ? ? ? ? ? ? ? // TODO Auto-generated catch block ??
? ? ? ? ? ? ? ? ? ? e.printStackTrace(); ??
? ? ? ? ? ? ? ? } ??
? ? ? ? ? ? } ??
? ? ? ? } ??
? ? } ??
public static void main(String[] args) throws MQException {
connect();
sendMsg("fuck 你大爺?shù)?#34;);
receiveMsg();
}
}
?
====================
http://www.ibm.com/developerworks/cn/java/wa-spring4/index.html
在 Spring 系列 的第 4 期也是最后一期中,我將介紹 Spring JMS(Java 消息服務(wù))框架的特性。JMS PG 定義了 Java 應(yīng)用程序通過面向消息的中間件(MOM)創(chuàng)建和交換消息的標(biāo)準(zhǔn)途徑。
就像在這個(gè)系列前面的文章中一樣,我將使用一個(gè)簡單的示例來演示 Spring JMS 的特性。您將隨我一道開發(fā)一個(gè)點(diǎn)對點(diǎn)的(P2P)基于消息的系統(tǒng),使用 Spring JMS 框架通過 JMS 接口與 IBM 的 WebSphere MQ 集成。完成練習(xí)后,將可以通過這個(gè)系統(tǒng)發(fā)送和接收簡單的文本消息。
在開始之前,請 下載文章的源代碼。請參閱 參考資料 訪問 Spring 框架和 IBM WebSphere MQ 5.3。還需要 Apache Ant 來運(yùn)行示例應(yīng)用程序。
Spring JMS
Spring 的 JMS 抽象框架簡化了 JMS API 的使用,并與 JMS 提供者(比如 IBM 的 WebSphere MQ 5.3)平滑地集成。org.springframework.jms.core 包提供了在 Spring 中使用 JMS 的核心功能。它的模板類處理資源的創(chuàng)建和釋放,簡化了 JMS 的使用。
像其他大多數(shù) Spring 模板類一樣,JMS 模板類提供了執(zhí)行公共操作的 helper 方法。在需要更復(fù)雜應(yīng)用的情況下,類把處理任務(wù)的核心委托給用戶實(shí)現(xiàn)的回調(diào)接口。JMS 類提供了方便的方法,用來發(fā)送消息、同步地使用消息以及向用戶公開 JMS 會(huì)話和消息的制作者。
以下 JMS 包和 org.springframework.jms.core 一起構(gòu)成了 Spring JMS 的功能:
org.springframework.jms.support回頁首
IBM WebSphere MQ
就像前面提到的,示例應(yīng)用程序會(huì)用 Spring 的 JMS 框架通過 JMS 接口與 IBM 的 WebSphere MQ 集成。通過在應(yīng)用程序和 Web 服務(wù)之間傳遞消息,WebSphere MQ 提供了可靠的、有恢復(fù)能力的應(yīng)用程序集成。它使用隊(duì)列和事務(wù)性工具幫助保持消息跨網(wǎng)絡(luò)的完整性。WebSphere MQ 降低了信息丟失的風(fēng)險(xiǎn)和調(diào)和通信 IT 系統(tǒng)的需要。
WebSphere MQ 在它所支持的所有平臺上提供了一致的應(yīng)用程序編程接口,這有助于讓集成的程序可移植。除了標(biāo)準(zhǔn)接口外,WebSphere MQ 還完整實(shí)現(xiàn)了JMS 接口,包括對發(fā)布-訂閱消息傳遞的支持。WebSphere MQ Explorer 工具可以遠(yuǎn)程地管理和配置整個(gè) MQ 網(wǎng)絡(luò)。管理和配置工具基于開放源碼的 Eclipse 框架,而且是可擴(kuò)展的。
回頁首
Spring JMS 模板
Spring 框架提供了 JmsTemplate 的兩個(gè)實(shí)現(xiàn)。JmsTemplate 類使用 JMS 1.1 API,子類 JmsTemplate102 則使用 JMS 1.0.2 API。我的示例應(yīng)用程序使用的是 JmsTemplate102。
JMS 模板被用來發(fā)送和接收 JMS 消息。Spring 采用回調(diào)機(jī)制對 JMS 信息傳遞進(jìn)行協(xié)調(diào)。MessageCreator 回調(diào)接口用 JmsTemplate 中的調(diào)用代碼提供的 Session 創(chuàng)建消息。為了支持 JMS API 更復(fù)雜的應(yīng)用,回調(diào) SessionCallback 向用戶提供了 JMS 會(huì)話,而 callback ProducerCallback 則公開了 Session 和 MessageProducer 組合。
清單 1 顯示了示例應(yīng)用程序使用的 JMS 模板的配置。清單摘自 spring-mqseries-jms.xml 文件(請參閱 下載)。
清單 1. JMS 模板配置
| <!-- JMS Queue Template --><bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate102"><property name="connectionFactory"><ref bean="jmsQueueConnectionFactory"/></property><property name="destinationResolver"><ref bean="jmsDestinationResolver"/></property><property name="pubSubDomain"><value>false</value></property><property name="receiveTimeout"><value>20000</value></property></bean> |
jmsQueueTemplate bean 與 JMS 連接工廠和 JMS 目標(biāo)解析器綁定在一起,用于解析 JMS 客戶機(jī)通過 JNDI 提供的目標(biāo)隊(duì)列名。connectionFactory 屬性指定了如何獲得到 JMS 提供者的連接。在本例中,清單 2 顯示了如何從 JNDI 檢索連接工廠。
清單 2. 通過 JNDI 配置 JMS 連接工廠
| <!-- JMS Queue Connection Factory --><bean id="internalJmsQueueConnectionFactory"class="org.springframework.jndi.JndiObjectFactoryBean"><property name="jndiTemplate"><ref bean="jndiTemplate"/></property><property name="jndiName"><value>MQ_JMS_MANAGER</value></property></bean> |
可以看到,JndiObjectFactoryBean 被綁定到 internalJmsQueueConnectionFactory。JndiObjectFactoryBean 用 JndiTemplate 屬性進(jìn)行 JNDI 查詢。Spring 將用 JndiTemplate 中指定的環(huán)境屬性和初始上下文在 JNDI 中查詢連接工廠。清單 3 顯示了 JndiTemplate 配置 bean 的配置。
清單 3. JNDI 查詢的 JNDI 模板配置
| <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"><property name="environment"><props><prop key="java.naming.factory.initial">com.sun.jndi.fscontext.RefFSContextFactory</prop><prop key="java.naming.provider.url">file:/C:/JNDI-Directory</prop></props></property></bean> |
以上配置進(jìn)行 JNDI 查詢時(shí)用 com.sun.jndi.fscontext.RefFSContextFactory 指定初始上下文工廠,用基于文件的 file:/C:/JNDI-Directory 作為提供者 URL。根據(jù)示例應(yīng)用程序的意圖,JNDI 訪問會(huì)采用基于文件的 FSContext 版本(請參閱 參考資料)的配置把 MQ 隊(duì)列綁定到 JNDI。
有了定義好的 JMS 模板,下一步就是把它綁定到示例應(yīng)用程序中,然后就可以用它發(fā)送和接收消息了。
回頁首
Spring JMS 實(shí)現(xiàn)
JMS 模板可以綁定到應(yīng)用程序中,以發(fā)送和接收 JMS 消息。在清單 4 中可以看出我如何把 清單 1 中的 JMS 模板綁定到示例應(yīng)用程序中。
清單 4. 把 JmsTemplate 綁定到應(yīng)用程序中
| <bean id="jmsSender" class="springexample.client.JMSSender"><property name="jmsTemplate102"><ref bean="jmsQueueTemplate"/></property></bean><bean id="jmsReceiver" class="springexample.client.JMSReceiver"><property name="jmsTemplate102"><ref bean="jmsQueueTemplate"/></property></bean> |
可以看到,我把 jmsQueueTemplate 綁定到用來發(fā)送和接收消息的 JmsSender 應(yīng)用程序 bean 和 JmsReceiver bean。清單 5 顯示了與 JMSSender 類有關(guān)的代碼。
清單 5. 用 JmsTemplate 發(fā)送 JMS 消息的 JMSSender
| public class JMSSender {private JmsTemplate102 jmsTemplate102;public JmsTemplate102 getJmsTemplate102() {return jmsTemplate102;}public void setJmsTemplate102(JmsTemplate102 jmsTemplate102) {this.jmsTemplate102 = jmsTemplate102;}public void sendMesage(){jmsTemplate102.send("JMS_RequestResponseQueue", new MessageCreator() {public Message createMessage(Session session) throws JMSException {return session.createTextMessage("This is a sample message");}});} |
JMSSender 類用 jmsTemplate102.send() 方法發(fā)送 JMS 消息。send() 方法的第一個(gè)參數(shù)是 JNDI 隊(duì)列名,隊(duì)列名指定了消息應(yīng)當(dāng)發(fā)送到哪里。(很快就會(huì)看到如何把 WebSphere MQ 的隊(duì)列名綁定到 JNDI。)send() 方法的第二個(gè)參數(shù)是 MessageCreator 類。JmsTemplate 中的調(diào)用代碼提供了 Session 類,這個(gè)類提供了一個(gè)創(chuàng)建 JMS 消息的回調(diào)接口。
下一步是用 JMS 的 Session 類創(chuàng)建一個(gè)簡單的文本消息。在代碼執(zhí)行時(shí),消息會(huì)傳遞給 WebSphere MQ 服務(wù)器的隊(duì)列。清單 6 顯示了使用 JmsTemplate 檢索 JMS 消息的 JMSReceiver 應(yīng)用程序 bean 的代碼。
清單 6. 用 JmsTemplate 檢索 JMS 消息的 JMSReceiver
| public class JMSReceiver {private JmsTemplate102 jmsTemplate102;public JmsTemplate102 getJmsTemplate102() {return jmsTemplate102;}public void setJmsTemplate102(JmsTemplate102 jmsTemplate102) {this.jmsTemplate102 = jmsTemplate102;}public void processMessage(){Message msg = jmsTemplate102.receive("JMS_RequestResponseQueue");try{TextMessage textMessage = (TextMessage) msg;if( msg!=null){System.out.println(" Message Received -->" + textMessage.getText());}}catch(Exception e){e.printStackTrace();}} } |
JMSReceiver 類用 jmsTemplate102.receive() 方法同步地接收 JMS 消息。receive() 方法指定 JNDI 隊(duì)列名,并從中檢索消息。JMSTemplate 類的 processMessage() 方法由接收 JMS 客戶機(jī)調(diào)用。JSMTemplate bean 的屬性 receiveTimeout(列在 JMSTemplate 配置中)指定接收客戶機(jī)同步地從隊(duì)列中接收消息時(shí)要等候的時(shí)間。
現(xiàn)在應(yīng)用程序的代碼已完成!下一步就是配置 WebSphere MQ 隊(duì)列并把它們綁定到 JNDI 對象。
回頁首
隊(duì)列管理器的設(shè)置
在運(yùn)行應(yīng)用程序之前,需要設(shè)置 WebSphere MQ 的隊(duì)列管理器和隊(duì)列,并把它們綁定到 JNDI。如果喜歡的話,可以按照這部分的示例做:只需 下載 設(shè)置 WebSphere MQ 隊(duì)列的批文件和應(yīng)用程序的源代碼和部署描述符即可。把 zip 文件解壓到驅(qū)動(dòng)器 C:。
設(shè)置隊(duì)列
運(yùn)行 C:\SpringSeriesPart4JMS\batch 文件夾中的 mqsetup.bat 文件。這個(gè)批文件要求在 path 環(huán)境變量中設(shè)置好 MQ 安裝的 bin 文件夾(例如 C:\mqseries\bin)。運(yùn)行了批文件之后,應(yīng)當(dāng)看到消息 “All valid MQSC commands were processed”。要打開 MQ Explorer 并檢查已經(jīng)創(chuàng)建的隊(duì)列管理器和隊(duì)列,請選擇 Start -> Programs -> IBM MQSeries -> MQSeriesExplorer。圖 1 顯示出示例應(yīng)用程序 QueueManager MQJMS.QManager 已經(jīng)創(chuàng)建并正在運(yùn)行。
圖 1. WebSphere MQ 的 QueueManager 配置
請?jiān)趹?yīng)用程序屏幕左側(cè)面板上點(diǎn)擊 MQJMS.QManager 下的 Queues 文件夾。應(yīng)當(dāng)看到已經(jīng)創(chuàng)建了一個(gè)隊(duì)列 RequestResponseQueue,如圖 2 所示。
圖 2. WebSphere MQ 的請求/響應(yīng)隊(duì)列配置
這就完成了隊(duì)列的設(shè)置。
設(shè)置 JMS 和 JNDI 管理
在示例應(yīng)用程序中,JNDI 的訪問利用了可以從 JNDI 主頁得到的基于文件的 FSContext 版本(請參閱 參考資料)。FSContext.jar 文件也包含在 WebSphere MQ 的 JMS 支持當(dāng)中。請?zhí)砑游募A \MQSeriesInstallable\MQSeries\Java\lib 和 \MQSeriesInstallable\MQSeries\Java\bin 到系統(tǒng)的 PATH 環(huán)境變量中。而且,請把 \MQSeriesInstallable\MQSeries\Java\lib 文件夾中的所有 jar 文件添加到系統(tǒng)的 CLASSPATH 環(huán)境變量中。還可以運(yùn)行 C:\SpringSeriesPart4JMS\batch 文件夾中的 classpath.cmd 文件,它會(huì)設(shè)置必要的 path 和 CLASSPATH 變量。要做到這點(diǎn),只需要修改 classpath.cmd 文件中的 MQ_JAVA_INSTALL_PATH,把它指到 WebSphere MQ JMS 的安裝目錄。
接下來,修改 \MQSeriesInstallableDirectory\Java\bin 中的 JMSAdmin.config 配置文件,MQSeries JMS 管理程序用它指明應(yīng)用程序要使用的上下文工廠和 JNDI 實(shí)現(xiàn)的地址。請取消以下行的注釋:
| INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextFactory |
并注釋掉其余兩個(gè) INITIAL_CONTEXT_FACTORY 變量。還要取消以下行的注釋:
| PROVIDER_URL=file:/C:/JNDI-Directory |
并注釋掉其余兩個(gè) PROVIDER_URL 變量。
可以在 C:\SpringSeriesPart4JMS\batch 文件夾中發(fā)現(xiàn)參考的示例配置文件。
為了保存 JNDI 對象,請?jiān)隍?qū)動(dòng)器 C: 上創(chuàng)建名為 JNDI-Directory 的目錄。切換到 \MQSeriesInstallableDirectory\Java\bin 目錄并運(yùn)行 JMSAdmin 批文件,應(yīng)當(dāng)看到 InitCtx 變量。
逐個(gè)輸入以下內(nèi)容:
| def qcf(MQ_JMS_MANAGER) qmgr(MQJMS.QManager)按回車def q(JMS_RequestResponseQueue) qmgr(MQJMS.QManager) queue(RequestResponseQueue)按回車 |
現(xiàn)在已經(jīng)把 WebSphere MQ 隊(duì)列綁定到 JNDI 對象,作為應(yīng)用程序客戶可以通過 JNDI 查詢對象。現(xiàn)在剩下的就是看代碼的實(shí)際作用了!
回頁首
運(yùn)行示例
要運(yùn)行示例,請從 spring sourceforge download 下載 Spring 框架和它的所有依賴文件并解壓,例如解壓到 c:\。會(huì)創(chuàng)建文件夾 C:\spring-framework-1.2-rc2(或最新版本)。
要運(yùn)行 Spring 應(yīng)用程序,請把本文的源代碼解壓到任意文件夾,例如 c:\。會(huì)創(chuàng)建文件夾 SpringSeriesPart4JMS。就像前面提到過的,還需要安裝 Apache Ant 和它的 Spring 依賴 jar 文件。請把 Spring 庫 —— 即 spring.jar(在 C:\spring-framework-1.2-rc2\dist 中)和 commons-logging.jar(在 C:\spring-framework-1.2-rc2\lib\jakarta-commons 中)拷貝到 SpringSeriesPart4JMS\lib 文件夾。還要把所有的 jar 庫從 \MQSeriesInstallableDirectory\Java\lib 目錄拷貝到 SpringSeriesPart4JMS\lib 文件夾。其中包含 MQseries 和 JMS 的相關(guān)庫。現(xiàn)在就擁有了構(gòu)建的依賴集。
接下來,打開命令提示符,切換到 SpringProject4 目錄,并在命令提示符下輸入以下命令:
| > ant -f build-jmssender.xml. |
這會(huì)構(gòu)建并運(yùn)行 SendMQSpringJMS 類,它會(huì)調(diào)用 JMSSender 類,發(fā)送消息到 WebSphere MQ RequestResponse 隊(duì)列。SendMQSpringJMS 還會(huì)通過它的 ClassPathXmlApplicationContext 裝入 spring 配置文件。一旦 bean 全部裝載,就可以通過 Spring 的 ApplicationContext 的 getBean() 方法訪問 JMSSender(請參閱清單 7)。
清單 7. 裝入示例應(yīng)用程序的 Spring 配置
| ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {"spring-mqseries-jms.xml"}); JMSSender jmsSender = (JMSSender)appContext.getBean("jmsSender"); |
消息傳遞到隊(duì)列上之后,請運(yùn)行 JMS 接收方客戶機(jī)以檢索消息。請打開命令提示符,切換到目錄 SpringProject4,并輸入:
| > ant -f build-jmsreceiver.xml |
這會(huì)構(gòu)建并運(yùn)行 ReceiveMQSpringJMS 類,該類會(huì)調(diào)用 JMSReceiver 類,以從 WebSphere MQ 的 RequestResponse 隊(duì)列接收文本消息。在控制臺上會(huì)打印出以下消息:
| Message Received --> This is a sample message. |
結(jié)束語
在 Spring 系列的最后這篇文章中,您學(xué)習(xí)了 Spring JMS 框架的基礎(chǔ)。我首先介紹了示例應(yīng)用程序的核心組件 —— Spring JMS 框架和 IBM 的 WebSphere MQ 5.3,然后介紹了如何用 Spring JMS 模板向 WebSphere MQ 隊(duì)列發(fā)送消息和從中接收消息。雖然這個(gè)示例非常簡單,但是可以把這里介紹的步驟應(yīng)用到更復(fù)雜的應(yīng)用程序。
我希望介紹 Spring 框架核心模塊的這一系列對您有所幫助。請參閱 參考資料 學(xué)習(xí)更多有關(guān) Spring 框架和 Spring JMS 的內(nèi)容。
總結(jié)
以上是生活随笔為你收集整理的java连接ibm mq的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle SQL Developer
- 下一篇: 利用SoapUI 测试web servi