我发现这段代码枚举了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);
}
}
}
答案 0 :(得分:2)
对我来说,您的示例代码仅列出队列,没有其他对象,但是它列出了所有队列。您可以添加另一个过滤器requestMessage.AddParameter(MQC.MQIA_Q_TYPE, MQC.MQQT_MODEL);
以仅列出模型队列。 MQC.MQIA_Q_TYPE
可用的其他值包括MQC.MQQT_LOCAL
,MQQT_ALIAS
,MQQT_CLUSTER
和MQC.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
}