MQQueue属性(Websphere MQ的C#API)

时间:2012-07-20 13:26:11

标签: c#-4.0 ibm-mq

我发现这段代码枚举了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);
                }

            }
        }

2 个答案:

答案 0 :(得分:2)

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

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

HTH

答案 1 :(得分:1)

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

如果只排队以PAYROLL开头的名称,则更改:

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

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

或添加if语句以排除您不想看到的队列名称:

if (!(queueName.startsWith("SYSTEM.")))
{
   // do something
}