Linux上的WebSphere MQ开发快速入门
引言
本文的目標是讓您輕松實現(xiàn) Linux? 上的 IBM? WebSphere? MQ 入門。由于大部分 Linux 服務(wù)器并沒有圖形用戶界面,因此本文將說明如何使用命令行工具在 Linux 上安裝和配置 WebSphere MQ。本文將說明如何使用 WebSphere MQ Java API 創(chuàng)建兩個示例 Java? 應(yīng)用程序:MQSend(用于向隊列發(fā)送消息)和 MQGet(用于從隊列接收消息)。
先決條件
- WebSphere MQ V6 安裝包。
- 一臺或兩臺安裝了 Linux 的計算機。本文使用兩臺安裝了 Suse Linux Enterprise Server V9 的計算機,不過也可以在一臺計算機上完成所有工作。
- Linux 管理技能。
- Java 開發(fā)方面的經(jīng)驗將有所幫助,但并非必須的,因為我們提供了經(jīng)過預(yù)編譯的 Java 示例應(yīng)用程序供下載和在命令行使用。
WebSphere MQ
WebSphere MQ 提供了連接層和應(yīng)用程序的可靠集成,為 SOA 提供了所需的基礎(chǔ)。WebSphere MQ 的主要特色功能包括:
有保證的消息交付有關(guān) WebSphere MQ 的更多信息,請參見本文結(jié)尾的參考資料。
安裝 WebSphere MQ
安裝 WebSphere MQ 的過程非常簡單——直接將安裝包釋放到目錄中即可(本文使用 root 主目錄下的 mq_install)。可以安裝 RPM 安裝包中的所有內(nèi)容,但本文僅需要這部分東西。以下是 WebSphere MQ V6 中包括的包和目錄:
| IBMJava2-SDK-1.4.2-0.0.i386.rpm MQSeriesClient-6.0.0-0.i386.rpm MQSeriesConfig-6.0.0-0.i386.rpm MQSeriesFTA-6.0.0-0.i386.rpm MQSeriesIES30-6.0.0-0.i386.rpm MQSeriesJava-6.0.0-0.i386.rpm MQSeriesKeyMan-6.0.0-0.i386.rpm MQSeriesMan-6.0.0-0.i386.rpm MQSeriesMsg_Zh_CN-6.0.0-0.i386.rpm MQSeriesMsg_Zh_TW-6.0.0-0.i386.rpm MQSeriesMsg_de-6.0.0-0.i386.rpm MQSeriesMsg_es-6.0.0-0.i386.rpm MQSeriesMsg_fr-6.0.0-0.i386.rpm MQSeriesMsg_it-6.0.0-0.i386.rpm MQSeriesMsg_ja-6.0.0-0.i386.rpm MQSeriesMsg_ko-6.0.0-0.i386.rpm MQSeriesMsg_pt-6.0.0-0.i386.rpm MQSeriesRuntime-6.0.0-0.i386.rpm MQSeriesSDK-6.0.0-0.i386.rpm MQSeriesSamples-6.0.0-0.i386.rpm MQSeriesServer-6.0.0-0.i386.rpm MQSeriesTXClient-6.0.0-0.i386.rpm PreReqs READMEs copyright gsk7bas-7.0-3.15.i386.rpm lap licenses |
下面是安裝步驟:
| wmq1:~/mq_install # rpm -ivh IBMJava2-SDK-1.4.2-0.0.i386.rpm wmq1:~/mq_install # rpm -ivh MQSeriesRuntime-6.0.0-0.i386.rpm wmq1:~/mq_install # rpm -ivh MQSeriesServer-6.0.0-0.i386.rpm wmq1:~/mq_install # rpm -ivh MQSeriesJava-6.0.0-0.i386.rpm |
WebSphere MQ 現(xiàn)在已經(jīng)完成安裝,并有用于進行配置的名為 mqm 的用戶和組。缺省情況下,WebSphere MQ 安裝在 /opt/mqm 中,隊列和其他配置信息位于用戶 mqm 的主目錄中。Java SDK 安裝在 /opt/IBMJava2-142 中,Java 解釋程序位于 /opt/IBMJava2-142/bin 中。
下一步是進行配置。本文為兩臺計算機使用了具有本地和遠程隊列的單個隊列管理器,用于測試示例應(yīng)用程序。
配置 WebSphere MQ
|
配置過程包括以下幾個步驟:
- 創(chuàng)建隊列管理器。
- 啟動隊列管理器。
- 創(chuàng)建隊列和通道。
- 啟動命令服務(wù)器、偵聽器和通道。
兩臺 WebSphere MQ 計算機都需要執(zhí)行這些步驟。下面的部分將僅說明如何在 WMQ1 上進行配置,但在 WMQ2 上也需要進行這些步驟。
創(chuàng)建并啟動隊列管理器
使用 root 登錄到 WMQ1,然后鍵入 su - mqm,以更改到用戶 mqm。使用以下命令為 WMQ1 計算機創(chuàng)建隊列管理器:
| mqm@wmq1:~/ # crtmqm WMQ1QM |
使用以下命令啟動隊列管理器。
| mqm@wmq1:~/ # strmqm WMQ1QM |
創(chuàng)建隊列和通道
使用命令行工具配置 WebSphere MQ。以下給出了 WMQ1 的配置腳本。此腳本定義本地隊列、遠程隊列、傳輸隊列、發(fā)送方通道和接收方通道。將以下腳本保存為 WMQ1QM.conf:
| DEFINE QLOCAL ('WMQ1InputQ') +REPLACEDEFINE QLOCAL ('WMQ2QMXmitQ') +DESCR('Transmission Queue to WMQ2QM') +USAGE(XMITQ) +TRIGGER +TRIGTYPE(FIRST) +TRIGDPTH(1) +TRIGDATA('WMQ1QM.WMQ2QM') +INITQ('SYSTEM.CHANNEL.INITQ') +REPLACEDEFINE QREMOTE ('WMQ1OutputQ') +XMITQ('WMQ2QMXmitQ') +RNAME('WMQ2InputQ') +RQMNAME('WMQ2QM') +REPLACEDEFINE CHANNEL ('WMQ1QM.WMQ2QM') CHLTYPE(SDR) +TRPTYPE(TCP) +CONNAME('192.168.28.72(1414)') +XMITQ('WMQ2QMXmitQ') +REPLACEDEFINE CHANNEL ('WMQ2QM.WMQ1QM') CHLTYPE(RCVR) +TRPTYPE(TCP) +REPLACEDEFINE CHANNEL ('SYSTEM.ADMIN.SVRCONN') CHLTYPE(SVRCONN) +TRPTYPE(TCP) +DESCR(' ') +HBINT(300) +MAXMSGL(4194304) +MCAUSER('MUSR_MQADMIN') +RCVDATA(' ') +RCVEXIT(' ') +SCYDATA(' ') +SCYEXIT(' ') +SENDDATA(' ') +SENDEXIT(' ') +REPLACE |
上面的配置腳本可作為其他 WebSphere MQ 安裝的模版使用。只需要更改粗體部分的名稱,即可在其他 WebSphere MQ 安裝中設(shè)置隊列和通道。此配置腳本中包含大量條目——有關(guān)它們的更多信息,請參見 WebSphere MQ 信息中心。
使用以下命令創(chuàng)建隊列和通道,以配置 WebSphere MQ:
| mqm@wmq1:~/ # runmqsc WMQ1QM < WMQ1QM.conf > qcreate.log |
runmqsc 命令用于發(fā)出 WebSphere MQ 命令。在本例中,這些命令從 WMQ1QM.conf 文件讀取,而輸出被定向到 qcreate.log。打開 qcreate.log,驗證其中不存在語法錯誤,全部有效命令均得到了處理。
啟動服務(wù)
需要啟動命令服務(wù)器、偵聽器和通道,然后就可以進行示例應(yīng)用程序的部署和測試工作了。
| mqm@wmq1:~/ # strmqcsv WMQ1QM & mqm@wmq1:~/ # runmqlsr -m WMQ1QM -t TCP & |
驗證隊列管理器和偵聽器在兩臺計算機上運行,然后啟動通道:
| mqm@wmq1:~/ # runmqchl -m WMQ1QM -c WMQ1QM.WMQ2QM & mqm@wmq1:~/ # runmqchl -m WMQ1QM -c WMQ2QM.WMQ1QM & |
現(xiàn)在已經(jīng)安裝了 WebSphere MQ,并進行了配置,已準備好可以進行測試了。下面一部分將給出兩個基于 Java 的應(yīng)用程序的源代碼,分別用于向隊列發(fā)送消息和從隊列接收消息。
示例應(yīng)用程序
用于將消息放入隊列中 (MQSend) 和從隊列獲取消息 (MQGet) 的示例 Java 應(yīng)用程序可使用前面部分中定義的隊列。這些應(yīng)用程序支持 String 消息,旨在用于測試和作為說明如何從 Java 應(yīng)用程序使用 WebSphere MQ 的示例。可以從腳本使用應(yīng)用程序,包括各種類型的應(yīng)用程序。MQSend 和 MQGet 都從 MQConnector 類進行擴展,該類可提供 WebSphere MQ 連接、初始化 WebSphere MQ、打開和關(guān)閉隊列,向隊列發(fā)送消息及從隊列接收消息。
MQConnector
MQConnector 是用于進行發(fā)送和獲取操作的超類。該類處理打開連接和發(fā)送及獲取消息的工作。將使用屬性文件對其進行配置,需要在屬性文件中指定主機地址、隊列管理器名稱和隊列名稱:
| queue.manager=WMQ1QM queue.manager.host=192.168.28.71 queue.name=WMQ1OutputQ |
以下是 MQConnector 源代碼:
| package mqconn;import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties;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 MQConnector {protected String qManager = ""; // define name of queue managerprotected String qManagerHost = "";protected String queuName = ""; // define name of queueprotected MQQueue mqQueue;protected MQQueueManager qMgr;public static boolean DEBUG = true;public MQConnector(){}public void initMq(){try{FileInputStream fis = new FileInputStream(new File("mqconnect.properties"));Properties props = new Properties();props.load(fis);fis.close();qManager = props.getProperty("queue.manager");qManagerHost = props.getProperty("queue.manager.host");queuName = props.getProperty("queue.name");// Create a connection to the queue managerMQEnvironment.channel = "SYSTEM.DEF.SVRCONN";MQEnvironment.hostname = qManagerHost;debug("Connecting to QueueManager " + qManager + " on " + qManagerHost);qMgr = new MQQueueManager(qManager);}catch (Exception e){e.printStackTrace();}}public void openQueue() throws MQException{// Set up the options on the queue we wish to open...// Note. All WebSphere MQ Options are prefixed with MQC in Java.int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;// Now specify the queue that we wish to open,// and the open options... debug("Opening queue: " + queuName);try{mqQueue = qMgr.accessQueue(queuName, openOptions);}catch(MQException mqe){//check if MQ reason code 2045//means that opened queu is remote and it can not be opened as //input queue//try to open as output onlyif(mqe.reasonCode==2045){openOptions = MQC.MQOO_OUTPUT;mqQueue = qMgr.accessQueue(queuName, openOptions);}}}public void putMessageToQueue(String msg) throws MQException{try{debug("Sending message: " + msg);MQPutMessageOptions pmo = new MQPutMessageOptions(); MQMessage mqMsg = new MQMessage();mqMsg.write(msg.getBytes());// put the message on the queuemqQueue.put(mqMsg, pmo);}catch (IOException e){e.printStackTrace();}}public String getMessageFromQueue() throws MQException {try{MQMessage mqMsg = new MQMessage();MQGetMessageOptions gmo = new MQGetMessageOptions();// Get a message from the queuemqQueue.get(mqMsg,gmo); //Extract the message dataint len=mqMsg.getDataLength();byte[] message = new byte[len];mqMsg.readFully(message,0,len);return new String(message);}catch(MQException mqe){int reason=mqe.reasonCode;if(reason==2033)//no messages{return null;}else{throw mqe;}} catch (IOException e){e.printStackTrace();return null;}}public void closeQueue() throws MQException{debug("Closing queue and disconnecting QueueManager...");// Close the queue...mqQueue.close();// Disconnect from the queue managerqMgr.disconnect();}protected boolean hasArg(String arg, String[] args){for(int i=0;i<args.length;i++){if(args[i].equals(arg)){return true;}}return false;}public void debug(Object msg){if (DEBUG){System.out.println(msg);}}} |
該類向其他應(yīng)用程序提供 WebSphere MQ 功能。還可以在自己的應(yīng)用程序中將 MQConnector 作為其他類的超類或?qū)嵱妙愂褂谩R韵路椒?Java 應(yīng)用程序提供消息傳遞功能:
initMQ()MQSend
MQSend(如下所示)將使用 MQConnector 類,是用于向隊列發(fā)送消息的命令行程序。消息作為命令行參數(shù)指定,可以使用其將文件內(nèi)容作為消息發(fā)送:
| package mqconn;import java.io.BufferedReader; import java.io.FileReader;import com.ibm.mq.MQException;public class MQSend extends MQConnector {public MQSend(){}public void send(String[] args) throws MQException{boolean argsAreFiles = hasArg("-f", args);initMq();openQueue();for (int i = 0; i < args.length; i++){if (args[i].equals("-f"))continue;if (!argsAreFiles){putMessageToQueue(args[i]);}else{try{// send file contents as messageBufferedReader br = new BufferedReader(new FileReader(args[i]));StringBuffer msg = new StringBuffer();for (String line = br.readLine(); line != null; line = br.readLine()){msg.append(line);msg.append('/n');}br.close();putMessageToQueue(msg.toString());}catch (Exception e){System.out.println("Error while processing file " + args[i] + ": "+ e.toString());}}System.out.println("Message sent.");}closeQueue();disconnectMq();}public static void main(String[] args){MQSend mqsend = new MQSend();MQConnector.DEBUG = false;try{if (args == null || args.length == 0){System.out.println("Usage: " + mqsend.getClass().getName()+ " [-f] <file name | message> [<file name | message> ...]");System.exit(0);}mqsend.send(args);}catch (Exception e){System.out.println(e.toString());System.out.println("Usage: " + mqsend.getClass().getName()+ " [-f] <file name | message> [<file name | message> ...]");}}} |
MQSend 使用 MQConnector 提供消息傳遞,實際的 MQSend 程序功能非常簡單。它有兩種操作模式:
- 將每個命令行參數(shù)作為獨立消息傳遞。
- 使用 -f 選項發(fā)送文件內(nèi)容。在本例中,每個命令行參數(shù)都是文件名。
MQGet
MQGet 類(如下所示)非常簡單——從指定的隊列檢索消息,并將其寫入到標準輸出。可以通過使用重定向?qū)⑾⒋鎯υ谖募小?/p>
| package mqconn;import com.ibm.mq.MQException;public class MQGet extends MQConnector {public MQGet(){}public String getMessages(String[] args) throws MQException{String message=getMessageFromQueue();return message;}public static void main(String[] args){MQGet mqget = new MQGet();MQConnector.DEBUG=false;try{mqget.initMq();mqget.openQueue();String msg=mqget.getMessages(args);if(msg!=null){System.out.println(msg); }mqget.closeQueue();mqget.disconnectMq(); }catch (Exception e){e.printStackTrace();System.out.println("Usage: "+mqget.getClass().getName()+" ");}} } |
MQGet 使用 mqconnect.properties 文件中指定的隊列管理器和隊列。下一部分將給出一些可供進行測試的示例用例。
示例用例
以下是一些用例,均使用 WMQ1 作為發(fā)送方,WMQ2 作為接收方,說明了如何使用 MQSend 和 MQGet 應(yīng)用程序。
準備工作
在使用示例前,您需要進行一些準備工作,如設(shè)置屬性和編寫一些 Helper 腳本等。為 WMQ1 中的 MQSend 應(yīng)用程序使用以下屬性:
| queue.manager=WMQ1QM queue.manager.host=127.0.0.1 queue.name=WMQ1OutputQ |
為 WMQ2 中的 MQGet 應(yīng)用程序使用以下屬性:
| queue.manager=WMQ2QM queue.manager.host=127.0.0.1 queue.name=WMQ2InputQ |
為了節(jié)約鍵入的時間,以下提供了用于進行發(fā)送和接收的兩個腳本。
| /opt/IBMJava2-142/bin/java -cp .:com.ibm.mq.jar mqconn.MQSend "$@" |
| /opt/IBMJava2-142/bin/java -cp .:com.ibm.mq.jar mqconn.MQGet "$@" |
使用 chmod 755 mqsend 和 chmod 755 mqget 將這些腳本轉(zhuǎn)換為可執(zhí)行文件。本文中的所有類和文件都位于 /var/mqm/bin 目錄中,其中 /var/mqm 是 mqm 用戶的主目錄。
命令
第一個示例命令將消息發(fā)送到上面指定的隊列。下面的示例清單給出了實際的命令,另外還給出了命令的輸出。
| mqm@wmq1:~/bin> ./mqsend "This is test message" MQJE001: Completion Code 2, Reason 2045 Message sent. |
MQJE001 是預(yù)期出現(xiàn)的內(nèi)容。Reason 2045 表示在本例中無法將要打開的隊列作為輸入隊列打開,因為此隊列是遠程隊列。MQJE001 由 WebSphere MQ 類輸出到標準錯誤。如果不希望看到這些錯誤消息,請將標準錯誤重新定向到 /dev/null ./mqsend "This is test message" 2> /dev/null。若要了解原因代碼的含義,請使用 mqrc 2045。
在 WMQ2 上,使用 mqget 命令接收消息:
| mqm@wmq2:~/bin> ./mqget This is test message |
如果再次執(zhí)行 mqget,會看到預(yù)期的 MQJE001 消息。mqrc 2033 中的 2033 表示“MQRC_NO_MSG_AVAILABLE”。檢索消息并將其從隊列刪除。以下代碼說明了如何發(fā)送多個消息:
| mqm@wmq1:~/bin> ./mqsend "This is test message" This is another message MQJE001: Completion Code 2, Reason 2045 Message sent. Message sent. Message sent. Message sent. Message sent. |
接收消息與上面所示的 mqget 命令相同。以下代碼說明了如何接收多個消息:
| mqm@wmq2:~/bin> ./mqget This is test message mqm@wmq2:~/bin> ./mqget This mqm@wmq2:~/bin> ./mqget is mqm@wmq2:~/bin> ./mqget another mqm@wmq2:~/bin> ./mqget message mqm@wmq2:~/bin> ./mqget MQJE001: Completion Code 2, Reason 2033 |
下一個示例將發(fā)送所有 Java 文件的內(nèi)容:
| mqm@wmq1:~/bin> ls -1 mqconn/*.java | awk '{print "mqsend -f "$1""}' | sh 2> /dev/null Message sent. Message sent. Message sent. |
下一個示例讀取消息并將其保存到文件中:
| mqm@wmq2:~/bin> ./mqget > msg1.txt |
mqget 命令的輸出被定向到 msg1.txt。
結(jié)束語
本文說明了 Linux 上的 WebSphere MQ 使用入門知識。只需要進行一些安裝和配置步驟,就能讓 WebSphere MQ 正常運行,而這些步驟正是了解 WebSphere MQ 的更多信息的良好起點。文中提供的示例應(yīng)用程序說明了可以如何方便地獲取對 WebSphere MQ 及消息傳遞功能的訪問。示例應(yīng)用程序還可作為開發(fā)自定義應(yīng)用程序的不錯借鑒。
|
下載
| mqsamples.zip | 332 KB | HTTP |
?
?
本文轉(zhuǎn)自 http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0705_salkosuo/0705_salkosuo.html#resources
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Linux上的WebSphere MQ开发快速入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。