1

我发现这段代码可以枚举 QueueManager 的队列列表。它有效,但我在它提供的列表中看到了很多系统队列,甚至频道名称。是否有一些属性我可以测试以查看它是否是“正常”用户定义的队列?ObjectType、QueueType、Usage 似乎总是为每个队列名称提供相同的值。

            // GET QueueNames - this worked on 07/19/2012 - but returned a lot of system queue, and unclear how to separate user queues from system queues. 
            PCFMessageAgent agent = new PCFMessageAgent(mqQMgr);

            // Build the query request.
            PCFMessage requestMessage = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_NAMES);
            requestMessage.AddParameter(MQC.MQCA_Q_NAME, "*");

            // Send the request and retrieve the response.
            PCFMessage[] responses = agent.Send(requestMessage);

            // Retrieve the values requested from the response.
            string[] queueNames = responses[0].GetStringListParameterValue(CMQCFC.MQCACF_Q_NAMES);
            //string[] objType = responses[0].GetStringListParameterValue(CMQCFC.MQIACF_OBJECT_TYPE);

            int loopCounter = 0;
            foreach (string queueName in queueNames)
            {
                loopCounter++;
                Console.WriteLine("QueueName=" + queueName);
                try
                {
                    mqQueue = mqQMgr.AccessQueue(
                             queueName,
                             MQC.MQOO_OUTPUT                   // open queue for output
                             + MQC.MQOO_INQUIRE              // inquire required to get CurrentDepth 
                             + MQC.MQOO_FAIL_IF_QUIESCING);   // but not if MQM stopping


                    Console.WriteLine("QueueName=" + queueName +
                                      " CurrentDepth=" + mqQueue.CurrentDepth +
                                      " MaxDepth=" + mqQueue.MaximumDepth + 
                                      " QueueType=" + mqQueue.QueueType +
                                      " Usage=" + mqQueue.Usage
                                      );
                }
                catch (MQException mex)
                {
                    Console.WriteLine(mex.Message);
                }

            }
        }
4

2 回答 2

2

对我来说,您的示例代码仅列出队列,没有其他对象,但是它列出了所有队列。您可以添加另一个过滤器requestMessage.AddParameter(MQC.MQIA_Q_TYPE, MQC.MQQT_MODEL);以仅列出模型队列。其他可用MQC.MQIA_Q_TYPE的值为MQC.MQQT_LOCALMQQT_ALIAS和。MQQT_CLUSTERMQC.MQQT_REMOTE

所有系统或预定义的队列名称都以 . 开头SYSTEM。因此,您可能可以在列出后使用此字符串过滤掉预定义的队列。此外,如果您查看队列定义,则有 DEFTYPE 属性,系统定义的队列的值为PREDEFINED. 但我无法添加第三个参数来按 DEFTYPE 过滤队列名称。我得到了 3014 原因码。

高温高压

于 2012-07-20T17:41:37.813 回答
1

正如 Shashi 所指出的,您只会看到来自该 PCF 命令的队列名称。

如果您只对以 PAYROLL 开头的名称进行排队,请更改:

requestMessage.AddParameter(MQC.MQCA_Q_NAME, "*");

requestMessage.AddParameter(MQC.MQCA_Q_NAME, "PAYROLL.*");

或者添加一个 if 语句来排除您不想看到的队列名称:

if (!(queueName.startsWith("SYSTEM.")))
{
   // do something
}
于 2012-07-20T19:37:33.317 回答