gpt4 book ai didi

java - 从 Channel 事件队列读取 PCF 消息中的参数

转载 作者:行者123 更新时间:2023-12-01 05:02:32 25 4
gpt4 key购买 nike

我正在使用 mo01 java 支持包从 SYSTEM.ADMIN.CHANNEL.EVENT Queue 读取事件消息。

下面是代码链接:

mo01java

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

ReasonQualifierSpecifies the identifier that qualifies the reason code.IdentifierMQIACF_REASON_QUALIFIER.DatatypeMQCFIN.ValuesOne of the following:MQRQ_CHANNEL_STOPPED_OKChannel has been closed with either a zero return code or a warning return code.MQRQ_CHANNEL_STOPPED_ERRORChannel has been closed, but there is an error reported and the channel is not in stopped or retry state.MQRQ_CHANNEL_STOPPED_RETRYChannel has been closed and it is in retry state.MQRQ_CHANNEL_STOPPED_DISABLEDChannel has been closed and it is in a stopped state.ReturnedAlways.

下面是部分代码,

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 HashMappublic 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_STOPPEDQMGR1CHL.TO.CHLASYSTEM.CLUSTER.TRANSMIT.QUEUE172.21.33.1239000CHL.TO.CHLA

如果某个 channel 停止,我想知道它是因问题停止还是正常正常停止的确切原因。该参数告诉我们 channel 停止的正确原因。

知道为什么这个参数不可检索吗?

最佳答案

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。看起来不合适的一个值是额外的 channel 名称,我相信这实际上是 AuxErrorDataStr1 但我将其映射为 ????因为无法从所提供的信息中确定。

如果我可以预见您的下一个问题,它可能是“好的,所以如果原因限定符表示 channel 要重试,那么 ErrorIdentifier 在哪里?”答案是 MQRQ_CHANNEL_STOPPED_RETRY 不是错误。这是正常的 channel 状态。 ErrorIdentifier 字段的描述指出,如果 channel 由于错误而停止,则 ReasonQualifier 字段将包含值 MQRQ_CHANNEL_STOPPED_ERROR。在本例中,ReasonQualifier 包含 MQRQ_CHANNEL_STOPPED_RETRY,因此 ErrorIdentifier 预计不会包含任何内容。

顺便请注意,MQRQ_CHANNEL_STOPPED_* 有点用词不当。 RETRY 中的 channel 不被视为已停止。它处于 RUNNINGSTOPPED 之间的中间状态,一旦重试次数耗尽,它可能会结束,或者可能会恢复到 RUNNING(如果重试成功。但是,生成该事件是为了记录 channel 从运行或空闲状态更改为功能较少的状态。

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

关于java - 从 Channel 事件队列读取 PCF 消息中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13203965/

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