java-MQ的管理
应用使用了MQ,但MQ没有一个合适的监控页面,监控手段比较匮乏,上周六出现了一次故障,当时如果有对MQ的监控手段,是能够及时发现问题,并防止故障的。在此之前就已经想自己写一个程序来监视MQ中的队列深度,以此来判断系统是否在干活。只是根据网上的资料一直都没能成功的获取MQ队列的深度,尽管这个功能是一段很简单代码,直到今天,从IBM的工程师那的到的一段代码,帮助我找到了之前的错误所在。
首先是要对MQ有个基本的了解,理解一些基本概念(我就是对一些基本概念理解不熟练导致一些参数写错了),然后就是看下面这个帖子:
这里对MQ的管理编程讲解得很到位,附的代码也很详尽。我采用的是PCF的方式。我仅仅需要完成对队列深度的获取,需要到IBM网站上下载一个lib,MS0b.zip文件,有一个com.ibm.mq.pcf-6.1.jar。相关代码如下:
2 PCFMessage request;
3 PCFMessage [] responses;
4 // Connect a PCFAgent to the specified queue manager
5 agent = new PCFMessageAgent ("IP", 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 ("IP", 14146, "SYSTEM.ADMIN.SVRCONN");
最后附上IBM工程师给我的代码,很简单,但是好在有关键的注解:
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();