java-MQ的管理

    应用使用了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 ("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();

 

posted @ 2009-02-25 23:29  badwood  阅读(5693)  评论(3编辑  收藏  举报
Badwood's Blog