應用使用了MQ,但MQ沒有一個合適的監控頁面,監控手段比較匱乏,上周六齣現了一次故障,當時如果有對MQ的監控手段,是能夠及時發現問題,並防止故障的。在此之前就已經想自己寫一個程式來監視MQ中的隊列深度,以此來判斷系統是否在幹活。只是根據網上的資料一直都沒能成功的擷取MQ隊列的深度,儘管這個功能是一段很簡單代碼,直到今天,從IBM的工程師那的到的一段代碼,協助我找到了之前的錯誤所在。
首先是要對MQ有個基本的瞭解,理解一些基本概念(我就是對一些基本概念理解不熟練導致一些參數寫錯了),然後就是看下面這個文章:
MQ系統管理編程概述
這裡對MQ的管理編程講解得很到位,附的代碼也很詳盡。我採用的是PCF的方式。我僅僅需要完成對隊列深度的擷取,需要到IBM網站上下載一個lib,MS0b.zip檔案,有一個com.ibm.mq.pcf-6.1.jar。相關代碼如下:
1 PCFMessageAgent agent;
2 PCFMessage request;
3 PCFMessage [] responses;
4 // Connect a PCFAgent to the specified queue manager
5 agent = new PCFMessageAgent ("134.175.7.84", 14146, "SYSTEM.ADMIN.SVRCONN");
6 // Build the request
7 request = new PCFMessage (CMQCFC.MQCMD_INQUIRE_Q);
8 request.addParameter (CMQC.MQCA_Q_NAME, "*");
9 request.addParameter (CMQC.MQIA_Q_TYPE, CMQC.MQQT_LOCAL);
10 request.addParameter (CMQCFC.MQIACF_Q_ATTRS,
11 new int [] { CMQC.MQCA_Q_NAME, CMQC.MQIA_CURRENT_Q_DEPTH });
12 // Use the agent to send the request
13 responses = agent.send (request);
14 // Display the results
15 for (int i = 0; i < responses.length; i++)
16 {
17 String name = responses [i].getStringParameterValue (CMQC.MQCA_Q_NAME);
18 int depth = responses [i].getIntParameterValue (CMQC.MQIA_CURRENT_Q_DEPTH);
19 }
20 // Disconnect
21 agent.disconnect ();
我弄錯的代碼主要是PCFMessageAgent ("134.175.7.84", 14146, "SYSTEM.ADMIN.SVRCONN");
最後附上IBM工程師給My Code,很簡單,但是好在有關鍵的註解:
MQEnvironment.CCSID = 1381; //要與隊列管理器的一樣
MQEnvironment.hostname = "localhost"; // 隊列管理器所在的機器名,要能ping通
MQEnvironment.port = 1414; // 隊列管理器的監聽連接埠
MQEnvironment.channel = "CHTEST";
MQQueueManager qmgr=new MQQueueManager("TESTQM"); //隊列管理器名稱
MQQueue queue = qmgr.accessQueue("QTEST",MQC.MQOO_INPUT_AS_Q_DEF); //隊列
MQMessage theMessage = new MQMessage();
MQGetMessageOptions gmo = new MQGetMessageOptions();
queue.get(theMessage,gmo);
//System.out.println("the message length is:"+theMessage.getDataLength());
//int i=theMessage.getDataLength();
System.out.println("the message is:"+theMessage.readLine());
queue.close();
qmgr.disconnect();