- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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/
我们目前使用 MQ Explorer 来管理 Z/OS 上的 WebSphere MQ V7。前几天误删了一个队列。后来我想回顾一下历史并查看一些日志以了解它究竟发生在何时。我的问题是,MQ Expl
默认情况下是否安装了扩展事务客户端?如何验证是否已安装?我如何安装这个? 最佳答案 在先前版本的 MQ 客户端中,它当然不包含在标准客户端中(事务客户端具有成本/许可影响)。 但是,从 WMQ v7.
我有 2 个队列,比如 Q1 和 Q2。当我使用 MQPUT 将消息插入 Q1 时,有什么方法可以将此消息复制到 Q2 中吗? WMQ 是否支持队列复制? 注意:队列驻留在不同的队列管理器上。 谢谢,
我有一个进程,它使用 JMSTemplate 根据 JMS header 值有选择地从 MQ 队列中出列。 当出队查询匹配队列前面的消息时,出队速率约为 60-70 条消息/秒。但是,当查询仅匹配 5
Source LogPrimaryFiles=3|2-254 (Windows)|2-510 (UNIX systems) The log files allocated when the queue
在Websphere MQ系列中,队列管理器的命令级别是701。它实际上指定了什么? 最佳答案 WebSphere 产品使用“[版本].[发行版].[修改].[修订包]”命名约定。例如,7.0.1.6
在哪里可以找到 IBM MQ 版本 V8.0.0.5 和 V9.0 之间的区别?我试图在 IBM 网站上查找它,但没有成功。 最佳答案 IBM 的 v9 知识中心页面“What's new in Ve
我已经在我的机器上安装了 MQ(已经用 regedit32 检查过)但是当我在命令提示符下键入“runmqsc”时出现错误“无法识别命令”(为 mqjms.jar 设置了环境变量)我是什么失踪 ?我想
我在我的系统中安装了 MQ V8.0.0.2,我正在应用修复包以使用静默安装方法将其升级到 8.0.0.5。它运行成功并完成,但 dspmqver仍然说版本为 8.0.0.2。 它在 64 位的 Wi
我们有一个场景,我们希望 node.js 应用程序使用来自后端系统的消息,该后端系统当前将消息放入 Websphere MQ 队列(通过 SAP PI)。 在 MQ 8.0.0.3 中,有一个 AMQ
我们有消息通过 WebSphere MQ 队列传入。我们需要很长时间才能收到消息。 是否有一种简单易行的方法来跟踪收到/提取消息的时间? 最佳答案 发送消息后,您可以请求确认交货。当消息被消费时,一条
我想将文件系统中的文件加载到 WebSphere MQ 队列。有几个支持 pacs - Q Program和 MO03: WebSphere MQ Queue Load / Unload Utilit
有人使用过 RPG 中的 MQ 吗?问题如下。队列中有几条消息。它们都带有 RFH2 header 。每个 header 都包含一组 NameValueData。我正在创建消息句柄并将其传递给 MQG
我有一组 IBM MQ 队列管理器,想知道其中一个何时重新启动或何时自动故障转移到备用实例。 队列管理器位于 AIX 上 问候, 最佳答案 您可以从 AMQERR01.LOG 中找到此信息。队列管理器
作为我们应用程序安装的一部分,我需要将一堆 xml 消息放入一个 MQ 队列中。为了使它更复杂,消息需要设置 RFH2 header 的 usr 文件夹。 我发现 mqput2.exe来自 IBM R
我一直在研究变幻莫测的 channel 状态、它们如何进入这些状态以及如何停止或启动它们。我现在已经有了相当扎实的理解,但是一位同事提出了 channel 重置的话题。 当我无法解释发生了什么时,我偶
我从 MQ 安全演示文稿中看到一项建议,如果您不需要命令服务器,它会关闭它。我的问题是如何确定我是否真的需要它。 从我的角度来看,如果没有运行目标 QMGR 的管理程序,例如 MQ Explorer
是否可以保留已检索且不再位于队列中的消息历史记录(包含消息内容将是完美的)? 在应用程序中,我可以看到发送者何时尝试将消息放入队列以及接收者何时尝试拾取消息,但我想查看消息何时真正到达队列以及消息何时
有没有办法找到在特定时间段内通过 IBM websphere MQ 队列管理器的消息总数? 最佳答案 这听起来像是 MQ 记帐和统计功能的完美使用。除此之外,这些功能还记录消息数量(具有持久和非持久计
我正在向远程队列发送消息,但我无法控制该队列。 我发送一个 xml 文件作为消息,但是当应用程序读取消息时,它会得到一个消息头,例如 jms_text \0\0\0lqueue:///TEST128
我是一名优秀的程序员,十分优秀!