如何在工作组安装上以编程方式清除MSMQ系统队列日志?

时间:2009-07-15 13:24:09

标签: .net msmq

我试试这个: MessageQueue mq = new MessageQueue(“。\ Journal $”); mq.Purge();

它在XP上运行良好。 但是,在Windows 2003服务器上,我总是有这个错误: “工作组安装计算机不支持该操作。”

2 个答案:

答案 0 :(得分:5)

系统队列的正确格式:

FormatName:Direct=os:.\\System$;JOURNAL

我在Windows 7和Windows 2003上测试了这种格式。

(os之后的点:表示本地主机/本地计算机)

var systemJournalQueue = new MessageQueue("FormatName:Direct=os:.\\System$;JOURNAL");
var systemDeadLetterQueue = new MessageQueue("FormatName:Direct=os:.\\System$;DEADLETTER");
var systemDeadXLetterQueue =new MessageQueue("FormatName:Direct=os:.\\System$;DEADXACT"));

systemJournalQueue.Purge();

或者如果你想保留N天的消息,你可以这样做:

private static void PurgeQueues(int archiveAfterHowManyDays, MessageQueue queue)
{
    queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(System.String) });
    queue.MessageReadPropertyFilter.ArrivedTime = true;

    using (MessageEnumerator messageReader = queue.GetMessageEnumerator2())
    {
        while (messageReader.MoveNext())
        {
            Message m = messageReader.Current;
            if (m.ArrivedTime.AddDays(archiveAfterHowManyDays) < DateTime.Now)
            {
                queue.ReceiveById(m.Id);
            }
        }
    }
}

答案 1 :(得分:1)

尝试使用格式名称,如下所示:

MessageQueue mq = new MessageQueue("DIRECT=OS:computername\SYSTEM$;JOURNAL");
mq.Purge();

我认为系统队列不能通过路径访问。您必须使用格式名称。

look at Yoel Arnon's comment at the bottom of the page.