我正在使用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而停止的确切原因。此参数告诉我们通道停止的正确原因。
知道为什么这个参数不可检索吗?
信息中心中的事件消息/频道停止页列出了返回的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 目前它只能获取一条消息。。 我想从服务总线(队列)获取所有消息。 提前谢谢。。