1

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

以下是代码链接:

mo01java

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

原因限定词
指定限定原因码的标识符。
标识符
MQIACF_REASON_QUALIFIER。
数据类型
MQCFIN。
价值观
以下之一:
MQRQ_CHANNEL_STOPPED_OK
通道已以零返回代码或警告返回代码关闭。

MQRQ_CHANNEL_STOPPED_ERROR
通道已关闭,但报错且通道未处于停止或重试状态。

MQRQ_CHANNEL_STOPPED_RETRY
通道已关闭,处于重试状态。

MQRQ_CHANNEL_STOPPED_DISABLED
通道已关闭,处于停止状态。

回来
总是。

下面是部分代码,

Map reasonCodes = new HashMap();
   /** MQ 命令名称和值的映射。*/
   映射命令 = new HashMap();
   /** MQ 字符串名称和值的映射。*/
   映射 stringNames = new HashMap();

私有字符串 getStringName(int stringInt)
 {
   return (String)stringNames.get(new Integer(stringInt));
 }
 /**
  * 将常量整数转换为其 MQ 命令名称。
  * @param stringInt MQ 整数。
  * @return 由常量整数表示的 MQ 命令名称。
  */
 私有字符串 getCommandName(int stringInt)
 {
   return (String)commands.get(new Integer(stringInt));
 }
// 下面的方法从类中检索 int 代码的字符串值并存储在 HashMap 中

公共无效 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);
 }

无效读取PCFMessage(PCFMessage pcfMessage){

枚举 pcfEnum = pcfMessage.getParameters();

标准输出 =
     标准输出 + "" + getReasonName(pcfMessage.getReason()) + "\n";

 而 (pcfEnum.hasMoreElements())
   {

     字符串参数名称;
     PCFParameter elt = (PCFParameter)pcfEnum.nextElement();
     参数名 = getStringName(elt.getParameter());

     标准输出 = 标准输出 + "";
     if (elt.getType() == CMQCFC.MQCFT_STRING_LIST)
     {
       字符串字符串[] = (String[])elt.getValue();
       for (int i = 0; i " + strings[i] + "\n";
       }
     }
     别的
       标准输出 = 标准输出 + elt.getValue().toString();
     标准输出 = 标准输出 + "\n";
   }

System.out.println(stdout);
}
输出:

MQRC_CHANNEL_STOPPED
QMGR1
CHL到CHLA
SYSTEM.CLUSTER.TRANSMIT.QUEUE
172.21.33.123
9
0
0
0
CHL到CHLA


如果一个频道被停止,我想知道它是因问题或正常而停止的确切原因。这个参数告诉我们频道停止的正确原因。

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

4

1 回答 1

0

Infocenter 中的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字段将包含 value MQRQ_CHANNEL_STOPPED_ERROR。在这种情况下,ReasonQualifiercontains MQRQ_CHANNEL_STOPPED_RETRYsoErrorIdentifier预计不会包含任何内容。

顺便提一下,这MQRQ_CHANNEL_STOPPED_*有点用词不当。输入的通道RETRY不被认为已停止。它处于中间状态,RUNNING一旦重试用尽,它可能会结束,或者如果重试成功STOPPED,它可能会恢复。RUNNING但是,会生成事件以记录通道从运行或空闲状态变为功能较少的状态。

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

于 2012-11-03T13:29:29.767 回答