MQ Java編程
《MQ Java編程》由會(huì)員分享,可在線閱讀,更多相關(guān)《MQ Java編程(28頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、 MQ Java編程 目標(biāo) 學(xué)習(xí)使用WebSphere MQ for Java編程。 1.1 概述 WebSphere MQ for Java允許用Java 編程語(yǔ)言寫成的程序直接訪問WebSphere MQ Server,或作為一個(gè)WebSphere MQ Client連接到WebSphere MQ。 1.2 平臺(tái) WebSphere MQ for Java 產(chǎn)品可用于以下平臺(tái): AIX iSeries 和OS/400 HP-UX Linux Sun Solaris z/OS 和OS/390 V2R9 或更高版本 Windows 平臺(tái)
2、 1.2.1 獲得軟件包 WebSphere MQ base Java的最新版本的安裝可以和WebSphere MQ同時(shí)安裝。關(guān)于WebSphere MQ的安裝可以參考下列資料: AIX 平臺(tái)的《WebSphere MQ for AIX, V5.3 Quick Beginnings 》 HP-UX平臺(tái)的《WebSphere MQ for HP-UX, V5.3 Quick Beginnings》 OS/400平臺(tái)的《WebSphere MQ for iSeries V5.3 Quick Beginnings 》 Linux 平臺(tái)的《WebSphere MQ for
3、 Linux for Intel and Linux for zSeries, V5.3 Quick Beginnings 》 Solaris 平臺(tái)的《WebSphere MQ for Solaris, V5.3 Quick Beginnings 》 Windows 平臺(tái)的《WebSphere MQ for Windows, V5.3 Quick Beginnings 》 z/OS 平臺(tái)的《WebSphere MQ for z/OS System Setup Guide 》 WebSphere MQ base Java 被包含在下列Java的.jar文件中: com
4、.ibm.mq.jar 這個(gè)jar文件支持所有的連接選項(xiàng)。 com.ibm.mqbind.jar 這個(gè)jar文件僅支持bindings連接,并不是在所有的平臺(tái)都提供或支持,所以我們推薦在新應(yīng)用程序中不要使用它。 1.2.2 WebSphere MQ for Java的運(yùn)行環(huán)境 為了運(yùn)行WebSphere MQ for Java,需要以下的軟件: 服務(wù)器端平臺(tái)的WebSphere MQ ; 服務(wù)器端平臺(tái)的Java Development Kit(JDK); 客戶端平臺(tái)的Java Development Kit 或Java Runtime Environmen
5、t(JRE)或支持Java 的網(wǎng)絡(luò)瀏覽器。 1.2.2.1安裝目錄 WebSphere MQ Java V5.3文件的安裝目錄如下表所示: 平臺(tái) 目錄 AIX /usr/mqm/java/ z/OS & OS/390 install_dir/mqm/java/ iSeries & AS/400(R) /QIBM/ProdData/mqm/java/ HP-UX 和 Sun Solaris /opt/mqm/java/ Linux install_dir/mqm/java/ Windows systems \Program Files\IBM\WebS
6、phere MQ\java 提示:install_dir 是產(chǎn)品安裝的目錄。在Linux 系統(tǒng)中,它可能是/opt,而在z/OS 和OS/390 系統(tǒng)上,它可能是/usr/lpp。 還提供了一些例子程序,例如安裝驗(yàn)證程序(IVP)。下表中列出了不同平臺(tái)的例子程序的目錄結(jié)構(gòu)。 平臺(tái) 目錄 AIX /usr/mqm/samp/java/base z/OS & OS/390 install_dir/mqm/java/samples/base iSeries & AS/400 /QIBM/ProdData/mqm/java/samples/base HP-UX and S
7、un Solaris /opt/mqm/samp/java/base Linux install_dir/mqm/samp/java/base Windows systems \Program Files\IBM\WebSphere MQ\tools\Java\base 提示:install_dir 是產(chǎn)品安裝的目錄。在Linux 系統(tǒng)中,它可能是/opt,而在z/OS 和OS/390 系統(tǒng)上,它可能是/usr/lpp。 1.2.2.2環(huán)境變量 產(chǎn)品安裝完成后,您必須更新CLASSPATH環(huán)境變量,CLASSPATH中需要包含WebSphere MQ base Java和
8、例子程序的目錄,如下表所示: 平臺(tái) CLASSPATH的參考設(shè)置 AIX CLASSPATH=/usr/mqm/java/lib/com.ibm.mq.jar: /usr/mqm/java/lib/connector.jar: /usr/mqm/java/lib: /usr/mqm/samp/java/base: HP-UX 和 Sun Solaris CLASSPATH=/opt/mqm/java/lib/com.ibm.mq.jar: /opt/mqm/java/lib/connector.jar: /opt/mqm/java/lib: /opt/mqm
9、/samp/java/base: Windows systems CLASSPATH=mq_root_dir(CPDNL1)\java\lib\com.ibm.mq.jar; mq_root_dir\java\lib\connector.jar; mq_root_dir\java\lib\; mq_root_dir\tools\java\base\; z/OS & OS/390 CLASSPATH=install_dir(CPDNL2)/mqm/java/lib/com.ibm.mq.jar: install_dir/mqm/java/lib/connector.jar
10、: install_dir/mqm/java/lib: install_dir/mqm/java/samples/base: iSeries & AS/400 CLASSPATH=/QIBM/ProdData/mqm/java/lib/com.ibm.mq.jar: /QIBM/ProdData/mqm/java/lib/connector.jar: /QIBM/ProdData/mqm/java/lib: /QIBM/ProdData/mqm/java/samples/base: Linux CLASSPATH=install_dir(CPDNL2)/mqm/jav
11、a/lib/com.ibm.mq.jar: install_dir/mqm/java/lib/connector.jar: install_dir/mqm/java/lib: install_dir/mqm/samp/java/base: 注意: 1. mq_root_dir 表示在Windows 系統(tǒng)的WebSphere MQ安裝目錄。通常是C:\Program Files\IBM\WebSphere MQ\。 2. install_dir是產(chǎn)品的安裝目錄。 如果現(xiàn)有的應(yīng)用程序依賴于com.ibm.mqbind,您必須要把com.ibm.mqbind.jar文件加到 c
12、lasspath中。 在某些平臺(tái)還必須要更新下列附加的環(huán)境變量,如下表所示: 平臺(tái) 環(huán)境變量 AIX LD_LIBRARY_PATH=/usr/mqm/java/lib HP-UX SHLIB_PATH=/opt/mqm/java/lib Sun Solaris LD_LIBRARY_PATH=/opt/mqm/java/lib Windows systems PATH=install_dir\lib z/OS & OS/390 LIBPATH=install_dir/mqm/java/lib Linux LD_LIBRARY_PATH=install_d
13、ir/mqm/java/lib 注意: install_dir是產(chǎn)品的安裝目錄。 注意: 確保您追加的WebSphere MQ的變量不要覆蓋現(xiàn)有的系統(tǒng)環(huán)境變量。如果覆蓋了系統(tǒng)的環(huán)境變量,那么應(yīng)用程序在編譯或運(yùn)行時(shí)將可能會(huì)失敗。 1.3 使用WebSphere MQ for Java 應(yīng)用程序連接到隊(duì)列管理器后,就可以與訪問WebSphere MQ對(duì)象(例如,隊(duì)列)。隊(duì)列管理器為其擁有的WebSphere MQ對(duì)象提供消息發(fā)送服務(wù)。使用WebSphere MQ classes for Java編程的方法依賴于使用的連接模式。連接的模式有兩種,分別是客戶連接模式和綁定模式。 1.
14、3.1客戶機(jī)連接模式 當(dāng)WebSphere MQ classes for Java作為客戶端時(shí),與WebSphere MQ C客戶端類似,但仍然存在如下區(qū)別: 1, 僅支持TCP/IP。 2, 不支持連接表。 3, 在啟動(dòng)時(shí),不讀取任何WebSphere MQ環(huán)境變量。 4, 通道的定義和環(huán)境變量信息都被存放在一個(gè)叫做Environment的類中,當(dāng)連接時(shí)這些信息也可以被作為入口參數(shù)。 5, 錯(cuò)誤和意外信息被寫到MQException類說(shuō)明的日志中。缺省錯(cuò)誤信息被寫到Java控制臺(tái)。 WebSphere MQ classes for Java 客戶端不支持MQBEGIN和快速綁定
15、。 當(dāng)利用客戶機(jī)連接時(shí),您必須指定其他一些環(huán)境屬性,以便建立與隊(duì)列管理器的連接。這些屬性是: 主機(jī)名,即作為隊(duì)列管理器主機(jī)的WebSphere MQ服務(wù)器的名字;以及通道名,即客戶 機(jī)連接通道的名字。另外,您也可以指定WebSphere MQ服務(wù)器監(jiān)聽的端口號(hào)。如果還沒有指定端口號(hào)的話,那么將使用默認(rèn)的端口號(hào)1414。 1.3.2綁定模式 在綁定模式(也稱作服務(wù)器連接模式)中,與隊(duì)列管理器的通訊利用的是進(jìn)程間通訊。關(guān)鍵因素之一就是,要記住綁定模式只適用于那些運(yùn)行在作為隊(duì)列管理器主機(jī)的WebSphere MQ 服務(wù)器上的程序。利用綁定模式的程序不會(huì)從WebSphere MQ客戶機(jī)機(jī)器上運(yùn)行
16、。換言之,應(yīng)用程序被綁定在隊(duì)列管理器所在的同一臺(tái)機(jī)器上。綁定模式是訪問WebSphere MQ 的一種快速而高效的方法。某些功能(如隊(duì)列管理器的擴(kuò)展架構(gòu)事務(wù)處理協(xié)同)只在綁定模式下才可用。 WebSphere MQ classes for Java的綁定模式與客戶連接模式存在下列區(qū)別: 1, 忽略了MQEnvironmnet類所提供的大多數(shù)參數(shù)。 2, 綁定模式支持MQBEGIN和快速綁定。 1.3.3 類庫(kù) WebSphere MQ classes for Java 提供了一系列可以使Java applet和應(yīng)用程序訪問WebSphere MQ的類。WebSphere MQ for
17、 Java 包括以下類和接口: 1.3.3.1類 MQChannelDefinition 該類用來(lái)傳遞有關(guān)連接隊(duì)列管理器的信息至發(fā)送、接收和安全退出。當(dāng)以綁定模式直接連接到WebSphere MQ時(shí),此類不適用。 MQChannelExit 當(dāng)調(diào)用發(fā)送、接收和安全退出時(shí),該類定義傳遞到這些調(diào)用的上下文信息。該類的exitResponse 屬性應(yīng)當(dāng)通過退出設(shè)置,以顯示W(wǎng)ebSphere MQ Client for Java 下一步應(yīng)當(dāng)采取何 種行動(dòng)。 MQDistributionList 該類代表開放式隊(duì)列集,我們可以利用put()方法的單一調(diào)用發(fā)送消息至這些隊(duì)列中。
18、我們利用MQDistributionList 構(gòu)造器或MQQueueManager 類的accessDistributionList()方法來(lái)做出該類的實(shí)例。 MQDistributionListItem 該類代表分配表中的單一項(xiàng)目(單一隊(duì)列)。該類繼承MQMessageTracker 類。 MQEnvironment 該類包含控制構(gòu)建MQQueueManager 對(duì)象(及其相對(duì)應(yīng)的到WebSphere MQ 的連接)環(huán)境的靜態(tài)元素變量。由于調(diào)用MQQueueManager 構(gòu)造器使該類值的集生效, 因此MQEnvironment 類的值應(yīng)當(dāng)在MQQueueManager 實(shí)例
19、構(gòu)建前設(shè)置。 MQException 該類包含WebSphere MQ 完成代碼和錯(cuò)誤代碼常量的定義。以MQCC_開始的常量是WebSphere MQ 完成代碼,而以MQRC_開始的常量則是WebSphere MQ 原因代碼。只要出現(xiàn)WebSphere MQ 錯(cuò)誤,就會(huì)給出MQException。 MQGetMessageOptions 該類包含控制MQQueue.get()方法行為的選項(xiàng)。 MQManagedObject 該類是MQQueueManager、MQQueue 和MQProcess 類的超類。它提供查詢并設(shè)置這些資源屬性的能力。 MQMessage
20、 該類代表WebSphere MQ 消息的消息描述器和數(shù)據(jù)。 MQMessageTracker 該類用來(lái)處理分配表中某個(gè)給定目的地的消息參數(shù)。MQDistributionListItem 繼承它。 MQPoolServices 用作WebSphere MQ 連接默認(rèn)ConnectionManager 的ConnectionManager,其實(shí)現(xiàn)可以使用該類。 MQPoolServicesEvent 只要添加或刪除MQPoolToken 到MQEnvironment 控制的權(quán)標(biāo)集,那么就可用該類來(lái)生成一個(gè)事件。當(dāng)默認(rèn)的ConnectionManager 改變時(shí), 即會(huì)生
21、成MQPoolServicesEvent。 MQPoolToken 該類可被用來(lái)提供默認(rèn)的連接集合。 MQProcess 該類為WebSphere MQ 進(jìn)程提供查詢操作。 MQPutMessageOptions 該類包含控制MQQueue.put()方法行為的選項(xiàng)。 MQQueue 該類為WebSphere MQ 隊(duì)列提供查詢、設(shè)置、放置和獲取操作。查詢和設(shè)置能力繼承自MQManagedObject。 MQQueueManager 該類代表WebSphere MQ 的隊(duì)列管理器。 MQSimpleConnectionManager 該類提
22、供基本的連接集合功能。 [ 本帖最后由 liusdream 于 2009-1-8 12:08 編輯 ] 搜索更多相關(guān)主題的帖子: Java Java TOP 2009年10月29日下午2~6點(diǎn),DB2性能調(diào)優(yōu)的親密接觸! 2# 大 中 小 發(fā)表于 2009-1-7 12:39 只看該作者 1.3.3.2接口 WebSphere MQ for Jave 具有以下接口: MQReceiveExit 該接口使得我們可以用WebSphere MQ for Java 檢查并有可能修改從隊(duì)列管理器接收的數(shù)據(jù)。當(dāng)以綁定模式直接連接到WebSphere
23、MQ 時(shí),該接口不適用。 MQSecurityExit 該接口使得我們可以嘗試定制連接到隊(duì)列管理器時(shí)出現(xiàn)的安全流。當(dāng)以綁定模式直接連接到WebSphere MQ 時(shí),這一接口不適用。 MQSendExit 該接口使得我們可以檢查并有可能修改用WebSphere MQ Client for Java 發(fā)送到隊(duì)列管理器的數(shù)據(jù)。當(dāng)以綁定模式直接連接到WebSphere MQ 時(shí),這一接口不適用。 1.4用WebSphere MQ Java API開展工作 我們?cè)诒竟?jié)中將探討利用WebSphere MQ Java API 進(jìn)行編程的方法。 1.4.1 設(shè)置連接 在本節(jié)中,我們將
24、看看綁定模式和客戶機(jī)連接模式是如何實(shí)現(xiàn)的。我們假定從設(shè)計(jì)的觀點(diǎn)出發(fā),您已經(jīng)決定用綁定模式或客戶機(jī)連接模式實(shí)現(xiàn),下面我們就來(lái)講解一下應(yīng)當(dāng)如何來(lái)實(shí)現(xiàn)的方法。 我們通過MQQueueManager 類的構(gòu)造器調(diào)用獲得到隊(duì)列管理器的連接。在這個(gè)時(shí)候,我們所獲得連接的類型是由MQEnvironment 類的某些靜態(tài)字段決定的。區(qū)別不同連接模式的靜態(tài)字段設(shè)置分別是主機(jī)、通道、userId 和口令。在這些用以連接到隊(duì)列管理器的MQEnvironment 字段中,最能區(qū)別出綁定模式和客戶機(jī)連接模式的兩個(gè)字段設(shè)置就是主機(jī)和通道。在綁定模式中,除了userId 和口令字段外,您不必為這些字段中的任何一個(gè)設(shè)置值。
25、您也可以選擇在綁定模式中設(shè)置它們。 MQEnvironment.hostName 對(duì)客戶機(jī)連接而言,我們應(yīng)當(dāng)將此設(shè)為隊(duì)列管理器所在主機(jī)的主機(jī)名。由于該主機(jī)名用于到隊(duì)列管理器運(yùn)行機(jī)器的TCP/IP 連接,因此其值不區(qū)分大小寫,請(qǐng)看下面的例子: MQEnvironment.host = “” ; MQEnvironment.channel 這是客戶機(jī)連接通道的名。該字段的值是區(qū)分大小寫的。一般說(shuō)來(lái),它就是隊(duì)列管理器下面服務(wù)器連接通道的名。是一個(gè)雙向鏈接,它使在客戶機(jī)和隊(duì)列管理器之間的MQI 調(diào)用和回復(fù)成為可能。對(duì)客戶機(jī)連接而言,我們應(yīng)當(dāng)將其設(shè)為應(yīng)用程序嘗試連接的隊(duì)列管
26、理器下面服務(wù)器連接通道的名,請(qǐng)看下面的例子: MQEnvironment.channel = “JAVA.CLIENT.CHNL”; MQEnvironment.port 端口號(hào)是一個(gè)可選字段。在默認(rèn)情況下,客戶機(jī)會(huì)嘗試在主機(jī)的1414 號(hào)端口上連接到隊(duì)列管理器。1414 號(hào)端口是WebSphere MQ監(jiān)聽器默認(rèn)使用的端口。如果該端口號(hào)與默認(rèn)的不同,那么您可以用MQEnvironment.port 字段來(lái)指定端口號(hào),請(qǐng)看下面的例子: MQEnvironment.port = nnnn; MQEnvironment.userId 和MQEnvironment.pass
27、word userId 和口令字段在默認(rèn)情況下是空的。您可以通過設(shè)置userId 和口令字段的值來(lái)指定userId 和口令,請(qǐng)看下面的例子: MQEnvironment.userId = “userXYZ” ; MQEnvironment.password = “password” ; MQEnvironment.properties 這是定義WebSphere MQ 環(huán)境的關(guān)鍵值對(duì)的散列表。如果您不是使用VisiBroker 連接的話,那么就應(yīng)當(dāng)將該字段在綁定和客戶機(jī)連接情況下都做如下設(shè)置: MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_WE
28、BSPHERE MQ MQEnvironment 類中的變量控制著到隊(duì)列管理器的連接調(diào)用。設(shè)置連接到隊(duì)列管理器的第一步就是根據(jù)連接模式的類型來(lái)設(shè)置MQEnvironment 字段, 我們通過創(chuàng)建MQQueueManager 類的新的實(shí)例、發(fā)出MQQueueManager 類的構(gòu)造器調(diào)用來(lái)獲得到隊(duì)列管理器的連接。MQQueueManager 類有過載的構(gòu)造器。我們要根據(jù)創(chuàng)建MQQueueManager 類新實(shí)例時(shí)提供的參數(shù)來(lái)調(diào)用合適的構(gòu)造器建立連接。在最簡(jiǎn)單的情況中,您可以提供隊(duì)列管理器名作為字符串,從而創(chuàng)建QueueManager 類的新實(shí)例,請(qǐng)看下面的例子: MQQueueManag
29、er qmgr = new MQQueueManager(“ITSOG.QMGR1”) ; 在這里,ITSOG.QMGR1是隊(duì)列管理器名。上面的方法在綁定模式和客戶機(jī)連接模式中都有效。 在第二種方法中,您可以提供隊(duì)列管理器名以及具有設(shè)置環(huán)境選項(xiàng)關(guān)鍵值對(duì)的散列表,從而創(chuàng)建MQQueueManager 類的新實(shí)例。利用這種方法時(shí),提供的屬性會(huì)覆蓋MQEnvironment 類中設(shè)置的值。如果您希望在隊(duì)列管理器到隊(duì)列管理器的情況下設(shè)置環(huán)境值,那么您就可以使用此方法。請(qǐng)看下面的例子: MQQueueManager qmgr = new MQQueueManager(queueManagerN
30、ame ,propertiesHashTable); 第三種方法就是通過提供隊(duì)列管理器名和隊(duì)列管理器打開選項(xiàng),從而創(chuàng)建MQQueueManager 類的新實(shí)例(它是一個(gè)整數(shù)字段)。只有在綁定模式中才能使用該方法。選項(xiàng)字段使您可以在快速綁定或正常綁定間作出選擇。請(qǐng)看下面的例子: MQQueueManager qmgr = new MQQueueMager(queueManagerName , MQC.MQCNO_FASTPATH_BINDING ) ; 3# 大 中 小 發(fā)表于 2009-1-7 12:39 只看該作者 1.4.2 打開隊(duì)列 為了對(duì)隊(duì)列進(jìn)行操作,我們
31、首先應(yīng)當(dāng)通過打開隊(duì)列以獲得隊(duì)列句柄或隊(duì)列對(duì)象。打開隊(duì)列有兩種方法。我們可以利用MQQueueManager 對(duì)象的accessQueue 方法,也可以通過調(diào)用MQQueue 類的構(gòu)造器。 這兩種不同調(diào)用的形式如下: MQQueue queue = qmgr.accessQueue(“qName’, openOption, “qMgrName” , “dynamicQname”, “alternateUserId”); 使用MQQueue 類構(gòu)造器的第二種方法,需要添加一個(gè)隊(duì)列管理器參數(shù), MQQueue queue = new MQQueue(qmgr, “qName’, o
32、penOption, “qMgrName” , “dynamicQname”, “alternateUserId”); WebSphere MQ 將在打開隊(duì)列過程中根據(jù)用戶認(rèn)證保證openOption 的有效性。MQQueue 類的對(duì)象代表著隊(duì)列。它既擁有有助于消息發(fā)送(即放置、獲取、設(shè)置、查詢)的方法,也有對(duì)應(yīng)于隊(duì)列屬性的屬性。 1.4.3 處理WebSphere MQ消息 MQMessage 類的對(duì)象代表著將被放置到隊(duì)列上或?qū)年?duì)列獲取的消息。它既包括應(yīng)用程序數(shù)據(jù),又包括MQMD。既具有對(duì)應(yīng)于MQMD 字段的屬性,又具有向消息寫入或從消息讀取不同數(shù)據(jù)類型的應(yīng)用程序數(shù)據(jù)的方法。在
33、應(yīng)用程序中,MQMessage 代表著一個(gè)緩沖區(qū)。應(yīng)用程序不必聲明緩沖區(qū)的大小,因?yàn)樗鼤?huì)隨著寫入的數(shù)據(jù)而不斷改變。但是,如果消息大小超過了隊(duì)列的MaximumMessageLength 屬性的話,您就不能將消息放到隊(duì)列中。 為了創(chuàng)建消息,您應(yīng)當(dāng)創(chuàng)建MQMessage 類的新實(shí)例。我們利用writeXXX 方法根據(jù)特定應(yīng)用程序數(shù)據(jù)類型將應(yīng)用程序數(shù)據(jù)寫入消息。數(shù)字和字符串等數(shù)據(jù)類型格式可以通過characterSet 和編碼等MQMD 屬性來(lái)控制。我們可以在放置消息到隊(duì)列上之前設(shè)置MQMD 字段,也可以在從隊(duì)列獲取消息時(shí)讀取MQMD 字段。應(yīng)用程序通過設(shè)置合適的放置或獲取操作選項(xiàng),從而控制著
34、消息放置到隊(duì)列或從隊(duì)列獲取消息的方式。我們通過設(shè)置合適的放置消息選項(xiàng)值來(lái)控制消息放置到隊(duì)列的方式。同樣,我們也可以通過設(shè)置合適的獲取消息選項(xiàng)來(lái)控制從隊(duì)列接收消息的方式。 放置消息選項(xiàng) 消息放置到隊(duì)列上的方式是由MQPutMessageOptions 類實(shí)例的選項(xiàng)字段的值來(lái)決定的。我們可以利用WebSphere MQ 常量接口 MQC 的MQPMO 結(jié)構(gòu)來(lái)設(shè)置選項(xiàng)的值。請(qǐng)看下面的例子: MQPutMessageOptions pmo = new MQPutMessageOption(); MQPutMessageOptions 類的實(shí)例,其選項(xiàng)屬性的值設(shè)置為默認(rèn)值。這在大多數(shù)
35、簡(jiǎn)單消息發(fā)送情境中都已經(jīng)足夠了。您可以利用WebSphere MQ 常量接口MQC 的MQPMO 結(jié)構(gòu)來(lái)設(shè)置任意特定的選項(xiàng),例如: pmo.options = pmo.options + MQC.MQPMO_NEW_MSG_ID 上面的例子設(shè)置了選項(xiàng)字段的值,指令隊(duì)列管理器為消息生成新的消息ID 并將其設(shè)為MQMD 的MsgId 字段。 獲取消息選項(xiàng) 從隊(duì)列接收消息的方式是由MQGetMessageOptions 類實(shí)例的選項(xiàng)字段的值決定的。我們可以利用WebSphere MQ Constants MQC 的MQOO 結(jié)構(gòu)來(lái)設(shè)置選項(xiàng)的值。請(qǐng)看下面的例子: MQGetMes
36、sageOptions gmo = new MQGetMessageOption(); MQGetMessageOptions 類的新實(shí)例將選項(xiàng)屬性的值設(shè)為默認(rèn)值。您可以利用MQPOO 結(jié)構(gòu)來(lái)設(shè)置合適的獲取消息選項(xiàng)。請(qǐng)看下面的例子: gmo.options = gmo.options + MQC.MQGMO_NO_WAIT; 以上選項(xiàng)指定了如果隊(duì)列上沒有消息的話,那么獲取消息調(diào)用將立即返回。發(fā)送消息我們利用MQQueue 類的put(MQMessage message)或put(MQMessage message, MQPutMessageOptions pmo)方法來(lái)發(fā)送消息
37、。放置方法調(diào)用控制著消息放置到隊(duì)列上的方式。 獲取消息 我們利用MQQueue 類的get ( MQMessage message ) 或get ( MQMessage, MQGetMessageOptions gmo)、get(MQMessage, MQGetMessageOptions gmo, int max MessageSize)方法來(lái)從WebSphere MQ 隊(duì)列接收消息。所有從給定MQQueueManager 到WebSphere MQ的調(diào)用都是同步的。 注意: 如果您進(jìn)行帶有等待的獲取調(diào)用的話,那么直到獲取調(diào)用完成之前,所有其他利 用相同MQQueu
38、eManager 的線程都將被封鎖,不能發(fā)出進(jìn)一步的WebSphere MQ調(diào)用。如果 您需要多線程同時(shí)來(lái)訪問WebSphere MQ的話,那么每個(gè)線程都必須創(chuàng)建其自己的MQQueueManager 對(duì)象。 如果沒有指定MaxMessageSize 的話,那么將自動(dòng)調(diào)整消息緩沖區(qū)長(zhǎng)度為將要到達(dá)的消息的大小。如果您以獲取方法調(diào)用使用MaxMessageSize 的話,那么該調(diào)用將能接收最大的消息。如果隊(duì)列上的消息比它還要大的話,那么就會(huì)出現(xiàn)下面兩種情況之一: 1. 如果MQC.MQGMO_ACCEPT_TRUNCATED_MSG 標(biāo)記在MQGetMessageOptions 對(duì)象的選
39、項(xiàng)元素變量中得到設(shè)置的話,那么將根據(jù)指定緩沖區(qū)的大小向消息填充最多的數(shù)據(jù),并且會(huì)返回完成代碼為MQException.MQCC_WARNING 和原因代碼為 MQException.MQRC_TRUNCATED_MSG_ACCEPTED的結(jié)果。 2. 如果沒有設(shè)置MQC.MQGMO_ACCEPT_TRUNCATED_MSG 標(biāo)記的話,那么消息將被留在隊(duì)列上,并且會(huì)返回完成代碼是MQException.MQCC_WARNING 和原因代碼是 MQeception.MQRC_TRUNCATED_MSG_FAILED 的結(jié)果。 1.5應(yīng)用程序開發(fā) 在本節(jié)中,我們將探討發(fā)送-遺忘、請(qǐng)求/
40、回復(fù)和消息分組點(diǎn)到點(diǎn)消息發(fā)送模式的實(shí)現(xiàn)。在點(diǎn)到點(diǎn)模式中,應(yīng)用程序成對(duì)活動(dòng)。我們稱作發(fā)送器的發(fā)送應(yīng)用程序?qū)⑾⒎胖迷诎l(fā)送方的WebSphere MQ 應(yīng)用程序隊(duì)列上。在目的地系統(tǒng)或接收方上,我們稱作接收器的應(yīng)用程序從WebSphere MQ 應(yīng)用程序隊(duì)列接收消息。因此,發(fā)送器和接收器應(yīng)用程序是成對(duì)活動(dòng)的,實(shí)現(xiàn)了在來(lái)源和目的地系統(tǒng)之間的數(shù)據(jù)移動(dòng)或消息發(fā)送。 在我們所舉的這些例子中,用到了到隊(duì)列管理器的客戶機(jī)連接。在這些例子中用到的WebSphere MQ 對(duì)象是在主機(jī)ITSOG 上稱作ITSOG.QMGR1 的隊(duì)列管理器。用于客戶機(jī)連接的通道是JAVA.CLIENT.CHNL,端口就是默認(rèn)端
41、口1414。我們所用的應(yīng)用程序隊(duì)列是SAMPLE.QUEUE。 1.5.1簡(jiǎn)單的消息發(fā)送器應(yīng)用程序 我們的第一個(gè)點(diǎn)到點(diǎn)客戶機(jī)程序?qū)?chuàng)建一個(gè)簡(jiǎn)單的消息并發(fā)送它到WebSphere MQ 隊(duì)列。我們還將講解處理發(fā)送器發(fā)送消息的接收器程序。 有關(guān)步驟如下: 調(diào)入WebSphere MQ Java API package; 為客戶機(jī)連接設(shè)置環(huán)境屬性; 連接到隊(duì)列管理器; 為打開WebSphere MQ 隊(duì)列設(shè)置選項(xiàng); 為發(fā)送消息打開應(yīng)用程序隊(duì)列; 設(shè)置選項(xiàng),放置消息到應(yīng)用程序隊(duì)列上; 創(chuàng)建消息緩沖區(qū); 使用用戶數(shù)據(jù)和任何消息描述器字段準(zhǔn)備消息;
42、 放置消息到隊(duì)列上。 以下程序PtpSender.java 就是將在應(yīng)用程序隊(duì)列上發(fā)送消息的發(fā)送器應(yīng)用程序: import com.ibm.mq.*; public class Typesetter { public static void main(String args[]) { try { String hostName = "ITSOG" ; String channel = "JAVA.CLIENT.CHNL" ; String qManager = "ITSOG.QMGR1" ; String qName = "SAMPLE.QUEUE" ; /
43、*設(shè)置MQEnvironment 屬性以便客戶機(jī)連接*/ MQEnvironment.hostname = hostName ; MQEnvironment.channel = channel ; MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_WEBSPHERE MQ); /*連接到隊(duì)列管理器*/ MQQueueManager qMgr = new MQQueueManager(qManager) ; /*設(shè)置打開選項(xiàng)以便打開用于輸出的隊(duì)列,如果隊(duì)列管理器正在停止,我們也已設(shè)置了選項(xiàng)去應(yīng)對(duì)
44、不成功情況。*/ int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING ; /*打開隊(duì)列*/ MQQueue queue = qMgr.accessQueue(qName, openOptions, null, null, null); /*設(shè)置放置消息選項(xiàng)我們將使用默認(rèn)設(shè)置*/ MQPutMessageOptions pmo = new MQPutMessageOptions(); /*創(chuàng)建消息,MQMessage 類包含實(shí)際消息數(shù)據(jù)的數(shù)據(jù)緩沖區(qū),和描述消息的所有MQMD 參數(shù)*/
45、/*創(chuàng)建消息緩沖區(qū)*/ MQMessage outMsg = new MQMessage(); /*設(shè)置MQMD 格式字段*/ outMsg.format = MQC.MQFMT_STRING ; /*準(zhǔn)備用戶數(shù)據(jù)消息*/ String msgString = "Test Message from PtpSender program "; outMsg.writeString(msgString); /*在隊(duì)列上放置消息*/ queue.put(outMsg, pmo); /*提交事務(wù)處理*/ qMmit(); System.out.println
46、(" The message has been Successfully put!\n"); /*關(guān)閉隊(duì)列和隊(duì)列管理器對(duì)象*/ queue.close(); qMgr.disconnect(); } catch (MQException ex) { System.out.println("An MQ Error Occurred: Completion Code is :\t" + pletionCode + "\n\n The Reason Code is :\t" + ex.reasonCode ); ex.printStackTrace(); } catch(E
47、xception e) { e.printStackTrace(); } } } TOP 2009年10月29日下午2~6點(diǎn),DB2性能調(diào)優(yōu)的親密接觸! ? 4# 大 中 小 發(fā)表于 2009-1-7 12:39 只看該作者 1.5.2簡(jiǎn)單的消息接收應(yīng)用程序 我們的下一個(gè)點(diǎn)到點(diǎn)客戶機(jī)程序是消息接收器應(yīng)用程序,它獲取PtpSender 應(yīng)用程序所發(fā)送的消息并在控制臺(tái)上將消息打印出來(lái)。 有關(guān)步驟如下: 調(diào)入WebSphere MQ Java API package; 為客戶機(jī)連接設(shè)置環(huán)境屬性; 連接到隊(duì)列管理器; 為打開WebSphe
48、re MQ 隊(duì)列設(shè)置選項(xiàng); 為獲取消息打開應(yīng)用程序; 設(shè)置選項(xiàng),從應(yīng)用程序隊(duì)列獲取消息; 創(chuàng)建消息緩沖區(qū); 從隊(duì)列獲取消息到消息緩沖區(qū); 從消息緩沖區(qū)讀取用戶數(shù)據(jù)并在控制臺(tái)上顯示。 以下程序PtpReceiver.java 就是將從應(yīng)用程序隊(duì)列上獲取消息的接收應(yīng)用程序: import com.ibm.mq.* ; public class PtpReceiver { public static void main(String args[]) { try { String hostName = "ITSOG" ; String channe
49、l = "JAVA.CLIENT.CHNL" ; String qManager = "ITSOG.QMGR1" ; String qName = "SAMPLE.QUEUE" ; /設(shè)置 MQEnvironment 屬性以便客戶機(jī)連接*/ MQEnvironment.hostname = hostName ; MQEnvironment.channel = channel ; MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_WEBSPHERE MQ); /*連接到隊(duì)列管理器*/
50、 MQQueueManager qMgr = new MQQueueManager(qManager) ; /*設(shè)置打開選項(xiàng)以便打開用于輸出的隊(duì)列,如果隊(duì)列管理器停止,我們也 已設(shè)置了選項(xiàng)去應(yīng)對(duì)不成功情況*/ int openOptions = MQC.MQOO_INPUT_SHARED | MQC.MQOO_FAIL_IF_QUIESCING ; /*打開隊(duì)列*/ MQQueue queue = qMgr.accessQueue(qName, openOptions, null, null, null); /*設(shè)置放置消息選項(xiàng)*/ MQGetMess
51、ageOptions gmo = new MQGetMessageOptions(); /*在同步點(diǎn)控制下獲取消息*/ gmo.options = gmo.options + MQC.MQGMO_SYNCPOINT ; /*如果在隊(duì)列上沒有消息則等待*/ gmo.options = gmo.options + MQC.MQGMO_WAIT ; /*如果隊(duì)列管理器停頓則失敗*/ gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING ; /*設(shè)置等待的時(shí)間限制*/ gmo.waitInterval =
52、3000 ; /*創(chuàng)建MQMessage 類*/ MQMessage inMsg = new MQMessage(); /*從隊(duì)列到消息緩沖區(qū)獲取消息*/ queue.get(inMsg, gmo) ; /*從消息讀取用戶數(shù)據(jù)*/ String msgString = inMsg.readString(inMsg.getMessageLength()); System.out.println(" The Message from the Queue is : " + msgString); /*提交事務(wù)*/ qMmit(); /*關(guān)閉隊(duì)列和隊(duì)列管理器
53、對(duì)象*/ queue.close(); qMgr.disconnect(); } catch (MQException ex) { System.out.println("An MQ Error Occurred: Completion Code is :\t" + pletionCode + "\n\n The Reason Code is :\t" + ex.reasonCode ); ex.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } } } 1.5.3請(qǐng)求/回復(fù)
54、在請(qǐng)求/回復(fù)消息發(fā)送模式中,一個(gè)應(yīng)用程序發(fā)送一條消息(請(qǐng)求消息)到另一個(gè)回復(fù)應(yīng)用程序(回復(fù)生成器)再到請(qǐng)求消息。生成回復(fù)的應(yīng)用程序獲取請(qǐng)求消息、處理請(qǐng)求, 并向請(qǐng)求應(yīng)用程序發(fā)出回復(fù)?;貜?fù)發(fā)送到由請(qǐng)求消息的消息標(biāo)題屬性replyToQueueManager 指定的隊(duì)列。請(qǐng)求應(yīng)用程序在放置消息到隊(duì)列上之前會(huì)在請(qǐng)求消息上設(shè)置這些消息標(biāo)題屬性。 請(qǐng)求應(yīng)用程序讓隊(duì)列管理器生成唯一的messageId,以及回復(fù)應(yīng)用程序拷貝請(qǐng)求消息的 messageId 到回復(fù)消息的correlationId 上。請(qǐng)求應(yīng)用程序使用回復(fù)消息的correlationId 值, 將回復(fù)映射回原始的請(qǐng)求。 我們將利用一對(duì)
55、簡(jiǎn)單的應(yīng)用程序來(lái)講解請(qǐng)求回復(fù)模式。第一個(gè)應(yīng)用程序(我們稱作請(qǐng)求器)放置一條簡(jiǎn)單的消息到隊(duì)列(請(qǐng)求隊(duì)列)上。請(qǐng)求器在放置請(qǐng)求消息到隊(duì)列上之前會(huì)在請(qǐng)求消息上設(shè)置replyToQueue 和replyToQueueManager 消息標(biāo)題屬性。而后,它將打開回復(fù)隊(duì)列并等待correlationId 匹配已發(fā)出請(qǐng)求消息的messageId 值的消息。服務(wù)于請(qǐng)求消息的回復(fù)應(yīng)用程序獲取消息,準(zhǔn)備回復(fù)消息,并將它發(fā)送到請(qǐng)求消息指定的隊(duì)列管理器下的回復(fù)隊(duì)列上。它還將從請(qǐng)求消息拷貝messageId 到回復(fù)消息的correlationId消息標(biāo)題字段。 應(yīng)用程序Requester.java 即發(fā)送請(qǐng)求消息
56、并且等待從回復(fù)應(yīng)用程序獲得回復(fù)的應(yīng)用程序。 有關(guān)步驟如下: 調(diào)入必要的包; 為客戶機(jī)連接設(shè)置MQEnvironment 屬性; 連接到隊(duì)列管理器; 打開請(qǐng)求隊(duì)列以獲得輸出; 設(shè)置放置消息選項(xiàng); - 準(zhǔn)備請(qǐng)求消息; - 設(shè)置到隊(duì)列名的回復(fù); 設(shè)置到隊(duì)列管理器名的回復(fù); 放置請(qǐng)求消息到請(qǐng)求隊(duì)列上; 關(guān)閉請(qǐng)求隊(duì)列; 打開回復(fù)隊(duì)列以獲得輸入; 設(shè)置獲取消息選項(xiàng); - 設(shè)置選項(xiàng),匹配回復(fù)消息上的correlationID; - 用等待(等待匹配correlationId 的回復(fù)消息)在回復(fù)隊(duì)列上發(fā)出獲取。 注意: 我們建議您為
57、回復(fù)消息在獲取調(diào)用上使用確定的等待時(shí)間。等待間隔可以設(shè)為系統(tǒng)所允許的等待回復(fù)的最大時(shí)間。 import com.ibm.mq.*; public class Requester { public static void main(String args[]) { try { String hostName = "ITSOG" ; String channel = "JAVA.CLIENT.CHNL" ; String qManager = "ITSOG.QMGR1" ; String requestQueue = "SAMPLE.REQUEST" ; String rep
58、lyToQueue = "SAMPLE.REPLY" ; String replyToQueueManager = "ITSOG.QMGR1" ; /*設(shè)置MQEnvironment 屬性以便客戶機(jī)連接*/ MQEnvironment.hostname = hostName ; MQEnvironment.channel = channel ; MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_WEBSPHERE MQ); /*連接到隊(duì)列管理器*/ MQQueueManager qMgr
59、 = new MQQueueManager(qManager) ; /*設(shè)置打開選項(xiàng)以便打開用于輸出的隊(duì)列,如果隊(duì)列管理器停止,我們也已設(shè)置了選項(xiàng)去應(yīng)對(duì)不成功情況*/ int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING ; /*打開打開隊(duì)列*/ MQQueue queue = qMgr.accessQueue(requestQueue, openOptions, null, null, null); /*設(shè)置放置消息選項(xiàng),我們將使用默認(rèn)設(shè)置*/ MQPutMessageOptions pm
60、o = new MQPutMessageOptions(); pmo.options = pmo.options + MQC.MQPMO_NEW_MSG_ID ; pmo.options = pmo.options + MQC.MQPMO_SYNCPOINT ; /*創(chuàng)建消息緩沖區(qū)*/ MQMessage outMsg = new MQMessage(); /*設(shè)置MQMD 格式字段*/ outMsg.format = MQC.MQFMT_STRING ; outMsg.messageFlags = MQC.MQMT_REQUEST ; outMsg.replyTo
61、QueueName = replyToQueue; outMsg.replyToQueueManagerName = replyToQueueManager ; /*準(zhǔn)備用戶數(shù)據(jù)消息*/ String msgString = "Test Request Message from Requester program "; outMsg.writeString(msgString); /*在隊(duì)列上放置消息*/ queue.put(outMsg, pmo); /*提交事務(wù)*/ qMmit(); System.out.println(" The message has
62、 been Successfully put\n"); /*關(guān)閉請(qǐng)求隊(duì)列*/ queue.close(); /*設(shè)置打開選項(xiàng)以便隊(duì)列響應(yīng)*/ openOptions = MQC.MQOO_INPUT_SHARED | MQC.MQOO_FAIL_IF_QUIESCING ; MQQueue respQueue = qMgr.accessQueue(replyToQueue, openOptions, null, null, null); MQMessage respMessage = new MQMessage(); MQGetMessageOptions gmo
63、 = new MQGetMessageOptions(); /*在同步點(diǎn)控制下獲取消息*/ gmo.options = gmo.options + MQC.MQGMO_SYNCPOINT ; gmo.options = gmo.options + MQC.MQGMO_WAIT ; gmo.matchOptions = MQC.MQMO_MATCH_CORREL_ID; gmo.waitInterval = 10000 ; respMessage.correlationId = outMsg.messageId ; /*獲取響應(yīng)消息*/ respQueue.get(r
64、espMessage, gmo); String response = respMessage.readString(respMessage.getMessageLength()); System.out.println("The response message is : " + response); qMmit(); respQueue.close(); qMgr.disconnect(); } catch (MQException ex) { System.out.println("An MQ Error Occurred: Completion Code is :\t
65、" + pletionCode + "\n\n The Reason Code is :\t" + ex.reasonCode ); ex.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } } } TOP 芯存絕配專家挑戰(zhàn)賽,上網(wǎng)本、iPhone、數(shù)碼相機(jī)大獎(jiǎng)等您拿! 眼鏡蛇的崛起:參與即有機(jī)會(huì)獲取精美禮品! 5# 大 中 小 發(fā)表于 2009-1-7 12:39 只看該作者 1.5.4回復(fù)應(yīng)用程序 回復(fù)器應(yīng)用程序Responder.java 處理來(lái)自請(qǐng)求隊(duì)列的請(qǐng)求
66、消息并發(fā)送回復(fù)到請(qǐng)求應(yīng)用程序指定的請(qǐng)求隊(duì)列上。 import com.ibm.mq.* ; public class Responder { public static void main(String args[]) { try { String hostName = "ITSOG" ; String channel = "JAVA.CLIENT.CHNL" ; String qManager = "ITSOG.QMGR1" ; String qName = "SAMPLE.REQUEST" ; /*設(shè)置MQEnvironment 屬性以便客戶機(jī)連接*/ MQEnvironment.hostname = hostName ; MQEnvironment.channel = channel ; MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中西方家庭教育的對(duì)比ppt課件
- 《運(yùn)籌學(xué)教程》第五版運(yùn)籌學(xué)6對(duì)策論矩陣對(duì)策課件
- (部編版)統(tǒng)編版四年級(jí)語(yǔ)文下冊(cè)第2課《鄉(xiāng)下人家》ppt課件
- 全等三角形1--公開課一等獎(jiǎng)ppt課件
- 《會(huì)跳舞樹葉娃娃》課件
- 9兒童詩(shī)兩首_人教版五年級(jí)的語(yǔ)文下冊(cè)課件
- 綠色植物是食物之源(我的課件)0
- 河南專版2022春八年級(jí)語(yǔ)文下冊(cè)第四單元16慶祝奧林匹克運(yùn)動(dòng)復(fù)興25周年習(xí)題課件新人教版
- 全國(guó)xx杯說(shuō)課大賽機(jī)械類一等獎(jiǎng)作品:鉗工車模的制作說(shuō)課ppt課件
- 六年級(jí)下冊(cè)數(shù)學(xué)ppt課件-總復(fù)習(xí)(1)數(shù)的認(rèn)識(shí)-整數(shù)∣北師大版
- 牛頓第二定律優(yōu)秀完整公開課ppt課件
- 調(diào)脂與卒中防治課件
- 點(diǎn)到平面的距離課件
- 聚焦新醫(yī)改形勢(shì)下的醫(yī)院發(fā)展戰(zhàn)略
- 四肢血管超聲基礎(chǔ)