Java 从通道事件队列读取PCF消息中的参数

Java 从通道事件队列读取PCF消息中的参数,java,ibm-mq,Java,Ibm Mq,我正在使用mo01 java支持包从SYSTEM.ADMIN.CHANNEL.event队列读取事件消息 以下是代码的链接: 我可以从通道事件队列中消耗的PCF消息中读取所有参数名称/值,但以下参数除外 ReasonQualifier Specifies the identifier that qualifies the reason code. Identifier MQIACF_REASON_QUALIFIER. Datatype MQCFIN. Values One of the fol

我正在使用mo01 java支持包从SYSTEM.ADMIN.CHANNEL.event队列读取事件消息

以下是代码的链接:

我可以从通道事件队列中消耗的PCF消息中读取所有参数名称/值,但以下参数除外

ReasonQualifier Specifies the identifier that qualifies the reason code. Identifier MQIACF_REASON_QUALIFIER. Datatype MQCFIN. Values One of the following: MQRQ_CHANNEL_STOPPED_OK Channel has been closed with either a zero return code or a warning return code. MQRQ_CHANNEL_STOPPED_ERROR Channel has been closed, but there is an error reported and the channel is not in stopped or retry state. MQRQ_CHANNEL_STOPPED_RETRY Channel has been closed and it is in retry state. MQRQ_CHANNEL_STOPPED_DISABLED Channel has been closed and it is in a stopped state. Returned Always. 推理限定符 指定限定原因代码的标识符。 标识符 MQIACF_原因_限定符。 资料型态 MQCFIN。 价值观 以下其中一项: MQRQ_通道已停止_正常 通道已用零返回码或警告返回码关闭。 MQRQ_通道_停止_错误 通道已关闭,但报告了错误,且通道未处于停止或重试状态。 MQRQ_通道已停止\u重试 通道已关闭,并且处于重试状态。 MQRQ_通道已停止_已禁用 通道已关闭且处于停止状态。 返回 总是。 下面是代码的一部分

Map reasonCodes = new HashMap(); /** Map of MQ command names and values. */ Map commands = new HashMap(); /** Map of MQ string names and values. */ Map stringNames = new HashMap(); private String getStringName(int stringInt) { return (String)stringNames.get(new Integer(stringInt)); } /** * Converts a constant integer to its MQ command name. * @param stringInt the MQ integer. * @return the MQ command name represented by the constant integer. */ private String getCommandName(int stringInt) { return (String)commands.get(new Integer(stringInt)); } // Below methods retrieves int code's string value from classes and store in HashMap public void setupMaps() { setupReasonNameSub("com.ibm.mq.pcf.CMQC", "MQRC", reasonCodes); setupReasonNameSub("com.ibm.mq.pcf.CMQCFC", "MQRC", reasonCodes); setupReasonNameSub("com.ibm.mq.pcf.CMQCFC", "MQCMD", commands); setupReasonNameSub("com.ibm.mq.pcf.CMQC", "MQCA", stringNames); setupReasonNameSub("com.ibm.mq.pcf.CMQCFC", "MQCA", stringNames); setupReasonNameSub("com.ibm.mq.pcf.CMQC", "MQIA", stringNames); setupReasonNameSub("com.ibm.mq.pcf.CMQC", "MQRQ", reasonCodes); } void readPCFMessage(PCFMessage pcfMessage){ Enumeration pcfEnum = pcfMessage.getParameters(); stdout = stdout + "" + getReasonName(pcfMessage.getReason()) + "\n"; while (pcfEnum.hasMoreElements()) { String parameterName; PCFParameter elt = (PCFParameter)pcfEnum.nextElement(); parameterName = getStringName(elt.getParameter()); stdout = stdout + ""; if (elt.getType() == CMQCFC.MQCFT_STRING_LIST) { String strings[] = (String[])elt.getValue(); for (int i = 0; i " + strings[i] + "\n"; } } else stdout = stdout + elt.getValue().toString(); stdout = stdout + "\n"; } System.out.println(stdout); }

Output:

MQRC_CHANNEL_STOPPED
QMGR1
CHL.TO.CHLA
SYSTEM.CLUSTER.TRANSMIT.QUEUE
172.21.33.123
9
0
0
0
CHL.TO.CHLA
Map reasonCodes=新的HashMap();
/**MQ命令名称和值的映射*/
Map commands=newhashmap();
/**MQ字符串名称和值的映射*/
Map stringNames=新建HashMap();
私有字符串getStringName(int-stringInt)
{
返回(字符串)stringNames.get(新整数(stringInt));
}
/**
*将常量整数转换为其MQ命令名。
*@param stringInt返回MQ整数。
*@返回由常量整数表示的MQ命令名。
*/
私有字符串getCommandName(int stringInt)
{
return(String)commands.get(newinteger(stringInt));
}
//下面的方法从类中检索int代码的字符串值并存储在HashMap中
公共地图()
{
setupReasonNameSub(“com.ibm.mq.pcf.CMQC”,“MQRC”,reasonCodes);
setupReasonNameSub(“com.ibm.mq.pcf.CMQCFC”,“MQRC”,reasonCodes);
setupReasonNameSub(“com.ibm.mq.pcf.CMQCFC”,“MQCMD”,命令);
setupReasonNameSub(“com.ibm.mq.pcf.CMQC”,“MQCA”,stringNames);
setupReasonNameSub(“com.ibm.mq.pcf.CMQCFC”,“MQCA”,stringNames);
setupReasonNameSub(“com.ibm.mq.pcf.CMQC”,“MQIA”,stringNames);
setupReasonNameSub(“com.ibm.mq.pcf.CMQC”,“MQRQ”,reasonCodes);
}
void readPCFMessage(PCFMessage PCFMessage){
枚举pcfEnum=pcfMessage.getParameters();
stdout=
stdout+“”+getReasonName(pcfMessage.getReason())+“\n”;
while(pcfEnum.hasMoreElements())
{
字符串参数名;
PCFParameter elt=(PCFParameter)pcfEnum.nextElement();
parameterName=getStringName(elt.getParameter());
标准输出=标准输出+“”;
if(elt.getType()==CMQCFC.MQCFT_字符串_列表)
{
字符串字符串[]=(字符串[])elt.getValue();
对于(int i=0;i“+字符串[i]+“\n”;
}
}
其他的
stdout=stdout+elt.getValue().toString();
stdout=stdout+“\n”;
}
System.out.println(标准输出);
}
输出:
MQRC_通道_已停止
QMGR1
CHL.TO.CHLA
SYSTEM.CLUSTER.TRANSMIT.QUEUE
172.21.33.123
9
0
0
0
CHL.TO.CHLA
如果一个通道被停止,我想知道它是因为问题还是正常OK而停止的确切原因。这个参数告诉我们通道停止的正确原因

知道为什么无法检索此参数吗?

信息中心的页面列出了返回的PCF消息中的所有字段。我已将这些字段映射到您发布的响应:

 #define MQRQ_CHANNEL_STOPPED_OK        7
 #define MQRQ_CHANNEL_STOPPED_ERROR     8
 #define MQRQ_CHANNEL_STOPPED_RETRY     9
 #define MQRQ_CHANNEL_STOPPED_DISABLED  10
cmqc.h
文件将原因码映射到其宏,如下所示:

我怀疑,如果要打印散列键和值,那么返回的整数9将表示您声称未收到的
MQIACF_REASON_限定符
,以及排序哪些字符串返回null。一个似乎不合适的值是额外的通道名,我相信这是实际的只需使用
AuxErrorDataStr1
即可,但我将其映射为???,因为无法从提供的信息中确定

如果我能预料到你的下一个问题,它可能是“OK,那么如果原因限定符说频道要重试,那么
ErrorIdentifier
在哪里?”?"答案是,
MQRQ\u CHANNEL\u STOPPED\u RETRY
不是错误。它是一种正常的通道状态。
ErrorIdentifier
字段的描述表明,如果通道由于错误而停止,
ReasonQualifier
字段将包含值
MQRQ\u CHANNEL\u STOPPED\u error
ReasonQualifier
包含
MQRQ\u通道\u停止\u重试
因此
ErrorIdentifier
不应包含任何内容

顺便说一句,请注意,
MQRQ\u CHANNEL\u STOPPED
有点用词不当。
RETRY
中的通道不被视为已停止。它处于
运行
停止
之间的中间状态,一旦重试失败,它可能会结束,或者如果重试成功。但是,生成该事件是为了记录通道从运行或空闲状态更改为不太正常的状态


直接回答您的问题“知道为什么此参数不可检索吗?”我质疑参数不可检索的前提。修改代码以打印键和值,我相信它将显示整型9值作为您要查找的原因限定符。

没有更多细节很难说。当您说参数“不可检索”时这是否意味着它不在PCF消息中?它在那里,但应用程序悄悄地忽略了它?抛出了一个错误?而且,SupportPac说它自2008年以来就没有更新过。如果它使用旧的PCF JAR并与新的JAR冲突,则可能存在问题。但这取决于您使用的WMQ服务器和客户端的版本我已经安装了,类路径和执行MO01的方式,但也没有提供这些详细信息。能否提供配置和错误的更多详细信息?我可以在消息中看到原因限定符值,但程序没有获得参数名称
 #define MQRQ_CHANNEL_STOPPED_OK        7
 #define MQRQ_CHANNEL_STOPPED_ERROR     8
 #define MQRQ_CHANNEL_STOPPED_RETRY     9
 #define MQRQ_CHANNEL_STOPPED_DISABLED  10