java-MQ的管理

本文分享了通过MQ消息队列进行系统监控的经验,重点介绍了如何利用PCF方式获取队列深度,以实现对系统运行状态的有效监测。文章提供了具体的Java代码示例,并指出了常见错误及其解决方案。

    应用使用了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工程师给我的代码,很简单,但是好在有关键的注解:

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();

转载于:https://www.cnblogs.com/badwood316/archive/2009/02/25/1398314.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值