我试图获取当前的深度,最后Puttime和使用Java从IBM MQ的监测队列表演最后得到的时间。 我可以用下面的代码来获取LPUTTIME与当前深度。 我使用MQMESSAGE浏览API。 但我有时间难以获取LGETTIME(最后消息得到时间) - 被加工出来的队列的最后一条消息。 由于MQMESSAGE浏览有没有像上次得到的时间。 对于任何帮助????
public int depthOf(String queueName) throws MQException {
MQQueue queue = qmgr.accessQueue(queueName, mqOpnOpt, null, null, null);
int qDpth = queue.getCurrentDepth();
queue.close();
//qmgr.disconnect();
System.out.println("Current Depth of "+ queueName + " is " + qDpth);
return qDpth;
}
@SuppressWarnings("unchecked")
private MQQueueManager createQueueManager() throws MQException {
MQEnvironment.channel = channel;
MQEnvironment.port = port;
MQEnvironment.hostname = host;
MQEnvironment.properties.put(CMQC.TRANSPORT_PROPERTY,
CMQC.TRANSPORT_MQSERIES);
return new MQQueueManager(manager);
}
/**
* Returns 1st message put time when it is put in to Queue and not consumed.
*
* @return
* @throws MQException
*/
public int queueMsgAge() throws MQException {
MQQueue queue = null;
MQMessage message = new MQMessage();
queue = qmgr.accessQueue(queueName, MQC.MQOO_BROWSE
| MQC.MQOO_FAIL_IF_QUIESCING);
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = MQC.MQGMO_BROWSE_FIRST | MQC.MQGMO_NO_WAIT;
queue.get(message, gmo);
GregorianCalendar cal = message.putDateTime;
long ageInMillis = new java.util.Date().getTime()
- cal.getTime().getTime();
int ageInSeconds = (int) ageInMillis / 1000;
System.out.println("Put Date & Time: "+ cal.getTime()
+ " Age of Msg in seconds: " + ageInSeconds + " Queue Name "
+ queueName);
_log.info("Put Date & Time: " + cal.getTime() + " Age of Msg in seconds: "
+ ageInSeconds + " Queue Name " + queueName);
return ageInSeconds;
}
首先阅读上面JoshMc&莫拉格的评论。
其次,你应该尝试一下的runmqsc发行两种类型的队列状态的命令。 即HANDLE VS队列。 注意:您有兴趣到队列状态类型(队列)相关的值。
即的runmqsc命令:
DIS QSTATUS(TEST.Q1) TYPE(QUEUE)
第三,不要使用MQEnvironment类,因为它不是线程安全的。 放入一个Hashtable的连接信息,并通过哈希表的MQQueueManager类。
正如评论上面提到的,你不能检索通过定期MQ程序的信息。 你需要写一个MQ Java程序,发出PCF命令队列管理器的命令服务器。
当创建一个PCF请求消息时,参数必须以特定的顺序加入。 这是一个有点痛,但你只能使用它。
下面是一个简单的MQ Java程序,它会发出PCF“查询队列状态”命令,通过PCF响应和输出得到PCF响应消息,环路的信息。
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;
import com.ibm.mq.MQException;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.CMQC;
import com.ibm.mq.constants.CMQCFC;
import com.ibm.mq.headers.MQDataException;
import com.ibm.mq.headers.pcf.PCFMessage;
import com.ibm.mq.headers.pcf.PCFMessageAgent;
/**
* Program Name
* MQListQueueStatus01
*
* Description
* This java class issues a PCF "inquire queue status" request message for all ("*") queues
* of a remote queue manager.
*
* Sample Command Line Parameters
* -m MQA1 -h 127.0.0.1 -p 1414 -c TEST.CHL -q TEST.Q1 -u UserID -x Password
*
* @author Roger Lacroix
*/
public class MQListQueueStatus01
{
private static final SimpleDateFormat lOGGER_TIMESTAMP = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
private Hashtable<String,String> params;
private Hashtable<String,Object> mqht;
private String qMgrName;
public MQListQueueStatus01()
{
super();
params = new Hashtable<String,String>();
mqht = new Hashtable<String,Object>();
}
/**
* Make sure the required parameters are present.
* @return true/false
*/
private boolean allParamsPresent()
{
boolean b = params.containsKey("-h") && params.containsKey("-p") &&
params.containsKey("-c") && params.containsKey("-m") &&
params.containsKey("-u") && params.containsKey("-x");
if (b)
{
try
{
Integer.parseInt((String) params.get("-p"));
}
catch (NumberFormatException e)
{
b = false;
}
}
return b;
}
/**
* Extract the command-line parameters and initialize the MQ HashTable.
* @param args
* @throws IllegalArgumentException
*/
private void init(String[] args) throws IllegalArgumentException
{
int port = 1414;
if (args.length > 0 && (args.length % 2) == 0)
{
for (int i = 0; i < args.length; i += 2)
{
params.put(args[i], args[i + 1]);
}
}
else
{
throw new IllegalArgumentException();
}
if (allParamsPresent())
{
qMgrName = (String) params.get("-m");
try
{
port = Integer.parseInt((String) params.get("-p"));
}
catch (NumberFormatException e)
{
port = 1414;
}
mqht.put(CMQC.CHANNEL_PROPERTY, params.get("-c"));
mqht.put(CMQC.HOST_NAME_PROPERTY, params.get("-h"));
mqht.put(CMQC.PORT_PROPERTY, new Integer(port));
mqht.put(CMQC.USER_ID_PROPERTY, params.get("-u"));
mqht.put(CMQC.PASSWORD_PROPERTY, params.get("-x"));
// I don't want to see MQ exceptions at the console.
MQException.log = null;
}
else
{
throw new IllegalArgumentException();
}
}
private void doPCF()
{
MQQueueManager qMgr = null;
PCFMessageAgent agent = null;
PCFMessage request = null;
PCFMessage[] responses = null;
try
{
qMgr = new MQQueueManager(qMgrName, mqht);
MQListQueueStatus01.logger("successfully connected to "+ qMgrName);
agent = new PCFMessageAgent(qMgr);
MQListQueueStatus01.logger("successfully created agent");
// https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.1.0/com.ibm.mq.ref.adm.doc/q087880_.htm
request = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_STATUS);
/**
* You can explicitly set a queue name like "TEST.Q1" or
* use a wild card like "TEST.*"
*/
request.addParameter (CMQC.MQCA_Q_NAME, "*");
request.addParameter(CMQCFC.MQIACF_Q_STATUS_TYPE, CMQCFC.MQIACF_Q_STATUS);
request.addParameter(CMQCFC.MQIACF_Q_STATUS_ATTRS,
new int [] { CMQC.MQCA_Q_NAME,
CMQC.MQIA_CURRENT_Q_DEPTH,
CMQC.MQIA_OPEN_INPUT_COUNT,
CMQC.MQIA_OPEN_OUTPUT_COUNT,
CMQCFC.MQCACF_LAST_PUT_DATE,
CMQCFC.MQCACF_LAST_PUT_TIME,
CMQCFC.MQCACF_LAST_GET_DATE,
CMQCFC.MQCACF_LAST_GET_TIME,
});
responses = agent.send(request);
for (int i = 0; i < responses.length; i++)
{
if ((responses[i]).getCompCode() == CMQC.MQCC_OK)
{
String name = responses[i].getStringParameterValue(CMQC.MQCA_Q_NAME);
int depth = responses[i].getIntParameterValue(CMQC.MQIA_CURRENT_Q_DEPTH);
int iprocs = responses[i].getIntParameterValue(CMQC.MQIA_OPEN_INPUT_COUNT);
int oprocs = responses[i].getIntParameterValue(CMQC.MQIA_OPEN_OUTPUT_COUNT);
String lastPutDate = responses[i].getStringParameterValue(CMQCFC.MQCACF_LAST_PUT_DATE);
String lastPutTime = responses[i].getStringParameterValue(CMQCFC.MQCACF_LAST_PUT_TIME);
String lastGetDate = responses[i].getStringParameterValue(CMQCFC.MQCACF_LAST_GET_DATE);
String lastGetTime = responses[i].getStringParameterValue(CMQCFC.MQCACF_LAST_GET_TIME);
MQListQueueStatus01.logger("Name="+name.trim()+" : depth="+depth + " : iprocs="+iprocs+" : oprocs="+oprocs+" : lastPutDate='"+lastPutDate.trim()+"' : lastPutTime='"+lastPutTime.trim()+"' : lastGetDate='"+lastGetDate.trim()+"' : lastGetTime='"+lastGetTime.trim()+"'");
}
}
}
catch (MQException e)
{
MQListQueueStatus01.logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
}
catch (IOException e)
{
MQListQueueStatus01.logger("IOException:" +e.getLocalizedMessage());
}
catch (MQDataException e)
{
MQListQueueStatus01.logger("MQDataException:" +e.getLocalizedMessage());
}
finally
{
try
{
if (agent != null)
{
agent.disconnect();
MQListQueueStatus01.logger("disconnected from agent");
}
}
catch (MQDataException e)
{
MQListQueueStatus01.logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
}
try
{
if (qMgr != null)
{
qMgr.disconnect();
MQListQueueStatus01.logger("disconnected from "+ qMgrName);
}
}
catch (MQException e)
{
MQListQueueStatus01.logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
}
}
}
/**
* A simple logger method
* @param data
*/
public static void logger(String data)
{
String className = Thread.currentThread().getStackTrace()[2].getClassName();
// Remove the package info.
if ( (className != null) && (className.lastIndexOf('.') != -1) )
className = className.substring(className.lastIndexOf('.')+1);
System.out.println(lOGGER_TIMESTAMP.format(new Date())+" "+className+": "+Thread.currentThread().getStackTrace()[2].getMethodName()+": "+data);
}
public static void main(String[] args)
{
MQListQueueStatus01 mqlqs = new MQListQueueStatus01();
try
{
mqlqs.init(args);
mqlqs.doPCF();
}
catch (IllegalArgumentException e)
{
MQListQueueStatus01.logger("Usage: java MQListQueueStatus01 -m QueueManagerName -h host -p port -c channel -u UserID -x Password");
System.exit(1);
}
System.exit(0);
}
}