我正在使用mo01 java support pack从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.
以下是代码的一部分,
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
如果某个频道已停止,我想知道它是否因问题或正常情况而停止的确切原因。此参数告诉我们通道停止的正确原因。
知道为什么这个参数不可检索?
答案 0 :(得分:0)
信息中心的Event Messages/Channel Stopped页面列出了返回的PCF消息中的所有字段。我已将字段映射到您发布的回复:
QMgrName MQCFST QMGR1
ReasonQualifier MQCFIN 9
ChannelName MQCFST CHL.TO.CHLA
ErrorIdentifier MQCFIN 0
AuxErrorDataInt1 MQCFIN 0
AuxErrorDataInt2 MQCFIN 0
AuxErrorDataStr1 MQCFST ""
AuxErrorDataStr2 MQCFST ""
AuxErrorDataStr3 MQCFST ""
XmitQName MQCFST SYSTEM.CLUSTER.TRANSMIT.QUEUE
ConnectionName MQCFST 172.21.33.123
???? MQCFST CHL.TO.CHLA (See below)
cmqc.h
文件将原因代码映射到其宏,如下所示:
#define MQRQ_CHANNEL_STOPPED_OK 7
#define MQRQ_CHANNEL_STOPPED_ERROR 8
#define MQRQ_CHANNEL_STOPPED_RETRY 9
#define MQRQ_CHANNEL_STOPPED_DISABLED 10
我怀疑如果您要打印哈希键以及值,那么您返回的整数9将代表您声称尚未收到的MQIACF_REASON_QUALIFIER
,以及整理出哪些字符串返回null。看似不合适的一个值是额外的通道名称,我相信实际上是AuxErrorDataStr1
,但我将其映射为????因为无法从所提供的信息中确切地说出来。
如果我可以预见到你的下一个问题,那可能是“好的,所以如果原因限定符说通道去了重试,那么ErrorIdentifier
?”答案是MQRQ_CHANNEL_STOPPED_RETRY
不是错误。这是一个正常的渠道状态。 ErrorIdentifier
字段的说明指出,如果频道由于错误而停止 ,ReasonQualifier
字段将包含值MQRQ_CHANNEL_STOPPED_ERROR
。在这种情况下,ReasonQualifier
包含MQRQ_CHANNEL_STOPPED_RETRY
,因此ErrorIdentifier
不应包含任何内容。
顺便提一下,请注意MQRQ_CHANNEL_STOPPED_*
有点用词不当。 RETRY
中的频道不被视为已停止。它处于RUNNING
和STOPPED
之间的中间状态,在重试耗尽后可能会结束,如果重试成功,则可能会恢复为RUNNING
。但是,会生成事件以记录通道从运行状态或空闲状态变为功能较弱的状态。
直接回答你的问题“我知道为什么这个参数不可检索?”我质疑参数不可检索的前提。修改代码以打印密钥和值,我相信它会显示整数9值作为您要查找的原因限定符。