c#中查询MSMQ系统队列

本文关键字:系统 队列 MSMQ 查询 | 更新日期: 2023-09-27 18:17:43

我使用系统的非常方便的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:直接= OS: localhost '系统美元;期刊"

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

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

任何想法我如何可以编程检索系统队列的内容(系统日志,死信和死信事务)?

c#中查询MSMQ系统队列

所以,结果是MessageQueue类的某些属性对于System队列的实例是不可访问的。QueueName就是其中之一!

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