gpt4 book ai didi

java - IBM MQ 使用 Java 获取 LGETTIME

转载 作者:行者123 更新时间:2023-12-02 02:00:53 30 4
gpt4 key购买 nike

我正在尝试使用 IBM Mq 的 java 来获取当前深度、上次放置时间和上次获取时间来监视队列性能。我能够使用下面的代码获取 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 和 Morag 上面的评论。

其次,您应该尝试使用 runmqsc 发出两种类型的队列状态命令。即句柄与队列。注意:您对与队列状态类型(QUEUE)相关的值感兴趣。

即运行mqsc命令:

DIS QSTATUS(TEST.Q1) TYPE(QUEUE)

第三,不要使用 MQEnvironment 类,因为它不是线程安全的。将连接信息放入 Hashtable 中,并将 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);
}
}

关于java - IBM MQ 使用 Java 获取 LGETTIME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51602454/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com