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

时间:2012-11-02 22:37:41

标签: java ibm-mq

我正在使用mo01 java support pack从SYSTEM.ADMIN.CHANNEL.EVENT队列中读取事件消息。

以下是代码链接:

mo01java

我能够从通道事件队列消耗的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


如果某个频道已停止,我想知道它是否因问题或正常情况而停止的确切原因。此参数告诉我们通道停止的正确原因。

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

1 个答案:

答案 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中的频道不被视为已停止。它处于RUNNINGSTOPPED之间的中间状态,在重试耗尽后可能会结束,如果重试成功,则可能会恢复为RUNNING。但是,会生成事件以记录通道从运行状态或空闲状态变为功能较弱的状态。

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