在C#中查询MSMQ系统队列

时间:2014-08-13 10:37:51

标签: c# message-queue msmq

我使用System.Messaging命名空间的非常方便的GetPrivateQueuesByMachine和GetPublicQueuesByMachine方法。我找不到相应的GetSystemQueuesByMachine,所以我写了自己的:

private MessageQueue[] GetSystemQueuesByMachine(string hostName)
{
    MessageQueue[] queueList = new MessageQueue[3];

    // System Journal
    string queuePath = GetQueuePath(hostName, "system$;JOURNAL");
    queueList[0] = new MessageQueue(queuePath);

    // Get the Dead Letter queue
    queuePath = GetQueuePath(hostName, "system$;DEADLETTER");
    queueList[1] = new MessageQueue(queuePath);

    // Transactional Dead Letter Queue
    queuePath = GetQueuePath(hostName, "system$;DEADXACT");
    queueList[2] = new MessageQueue(queuePath);

    return queueList;
}

private static string GetQueuePath(string hostName, string queueName)
{
    return "FormatName:DIRECT=OS:" + hostName + @"\" + queueName;
}

返回的queuePath看起来是正确的:

“FORMATNAME:DIRECT = OS:本地主机\系统$;作者”

但是当我尝试访问QueueName属性或调用GetAllMessages()方法时抛出异常:

“指定的格式名称不支持请求的操作。例如,无法删除直接队列格式名称。”

我知道如何以编程方式检索系统队列的内容(系统日志,死信和死信交易)?

1 个答案:

答案 0 :(得分:0)

因此,事实证明,对于系统队列的实例,无法访问MessageQueue类的某些属性。 QueueName就是其中之一!

我最终使用自定义方法GetSystemQueuesByMachine创建了一个自定义类SystemMessageQueue。这将返回带有我用来填充ListView的自定义名称的MessageQueue实例,我仍然可以对MessageQueue实例使用GetAllMessages()。