当前位置: 首页 > 知识库问答 >
问题:

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

穆正青
2023-03-14

我正在使用mo01 java支持包从系统读取事件消息。管理频道事件队列。

下面是代码的链接:

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


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

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

共有1个答案

柳绪
2023-03-14

信息中心中的事件消息/频道停止页列出了返回的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_限定符,以及排序哪些字符串返回null。一个似乎不合适的值是额外的频道名称,我相信这实际上是AuxErrorDataStr1,但我将其映射为????因为根据提供的信息无法确定。

如果我能预测你的下一个问题,它可能是“好的,所以如果限定符说通道重试了,错误标识符在哪里?”答案是MQRQ_CHANNEL_STOPPED_RETRY不是错误。是正常的信道状态。错误标识符字段的说明指出,如果通道由于错误而停止,则ReasonQualifer字段将包含值MQRQ_CHANNEL_STOPPED_ERROR。在这种情况下,ReasonQualifer包含MQRQ_CHANNEL_STOPPED_RETRY,因此错误标识符不会包含任何内容。

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

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

 类似资料:
  • 我刚才看到了三个方法的文档,当我们在工作线程中工作时,它们可以用来在UI线程中执行一段代码。方法有: > public final void runOnUIThread(Runnable action)-在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发布到UI线程的事件队列中 public boolean post(Runnable act

  • 有一个SQS队列,我在其中不断收到消息。我只需要阅读和处理过去24小时内收到的信息。目前收到的信息应在第二天处理<代码>时间戳存储在消息正文中。 是否可以从SQS队列中选择性地读取消息。例如,只读那些值大于前一天的时间戳但小于当前时间戳(当前时间戳是此作业运行的时间)的消息?

  • 我正在使用NET Core 5.0.0开发一个API Web ASP.NET Core项目,并使用Azure.Storage.Queues12.6.0来写入和读取队列消息。 一切正常,但我想知道我阅读消息的方式是否可以,或者在速度和效率方面有更好的方法。 这是我用的密码。它只是Microsoft教程中的一段代码,放在a while()循环中。AzureQueue只是QueueClient类的一个实

  • 我有一个应用程序,在这个应用程序中,我可以在进程的一部分中以JSON格式将消息写入Azure服务总线队列。我有一个下游进程,我想将该消息从队列中弹出,将json转换为一个对象,然后处理该对象。 我没有问题将消息推送到队列上,但我还没有找到任何将消息从队列中逐一或循环弹出的示例。我在微软或Github上看到的每一个例子都是一个控制台应用程序(在网络应用程序中毫无用处),它设置了某种侦听器,可以抓取队

  • 我有一个java客户机,它在队列中发送jms消息(“队列请求”)。该消息包含一个int属性(“id”),其中包含唯一的客户端id号。消息正在处理中,然后进入另一个队列(“队列响应”)。如何让客户机等到具有其id的消息在队列中,然后读取它。我曾尝试使用侦听器并实现onMessage,但当收到消息时,我如何停止侦听?

  • 我想从azure服务总线(队列)读取所有消息。 我已经按照下面的指示链接https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-php-how-to-use-queues 目前它只能获取一条消息。。 我想从服务总线(队列)获取所有消息。 提前谢谢。。