如何清空Windows消息队列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何清空Windows消息队列相关的知识,希望对你有一定的参考价值。

可以使用 Purge 方法清除“消息队列”系统中您有权访问的任何队列的内容。例如,假设在本地“消息队列”客户端上使用日记队列记录送出的所有消息的副本。当日记达到其大小上限时,您可以使用 Purge 方法清除不再需要的项。说明:存储在日记和死信队列中的消息计数以队列所在计算机的配额为限。当到达此配额时,这些队列停止接受新消息。如果在应用程序中使用日记和死信队列,定期从这些队列中清除不再需要的消息很重要。若要删除队列的内容,必须在“消息队列”中具有接收权限。清除队列时,它包含的所有消息不发送即被丢弃。可以从代码或“服务器资源管理器”中清除队列的内容。从“服务器资源管理器”中清除队列的内容打开“服务器资源管理器”,然后展开要清除的队列所在的服务器节点。提示:如果“服务器”节点中未列出所需的服务器,请右击“服务器”,单击“添加服务器”,输入服务器的名称,然后单击“确定”。展开“消息队列”节点。展开要删除其中的消息的队列。您将看到该队列的消息及其关联日记消息的一个或多个节点。右击要清除的消息节点,然后单击“清除消息”。以编程方式清除队列的内容使用 Purge 方法可以清除适当队列的内容。代码应类似于:Dim MessageQueue1 As New System.Messaging.MessageQueue() MessageQueue1.Path = ".\MyQueue" MessageQueue1.Purge() System.Messaging.MessageQueue MessageQueue1 = new System.Messaging.MessageQueue(); MessageQueue1.Path = @".\MyQueue"; MessageQueue1.Purge(); 此代码示例也可用作 IntelliSense 代码段。在代码段选择器中,此代码示例位于“Windows 操作系统”>“消息队列”中。请参见任务 如何:创建队列其他资源 创建、删除和管理队列 参考技术A 在“功能摘要”下的右窗格中,单击“添加功能”。在生成的窗口中,展开“消息队列”。展开“消息队列服务”。单击“目录服务集成”(用于加入域的计算机),然后单击“HTTP 支持”。单击“下一步”,然后单击“安装”。 2.在 Windows 7 或 Windows Vista 上安装消息队列 4.0打开“控制面板”。单击“程序”,然后在“程序和功能”下单击“打开或关闭 Windows 功能”。 展开“Microsoft Message Queue (MSMQ) 服务器”,展开“Microsoft Message Queue (MSMQ) 服务器核心”,然后选中对应于以下要安装的“消息队列”功能的复选框:MSMQ Active Directory 域服务集成(用于加入域的计算机)。 MSMQ HTTP 支持。单击“确定”。如果提示您重新启动计算机,请单击“确定”完成安装。3.在 Windows XP 和 Windows Server 2003 上安装消息队列 3.0打开“控制面板”。单击“添加/删除程序”,然后单击“添加/删除 Windows 组件”。选择“消息队列”并单击“详细信息”。注意:如果运行的是 Windows Server 2003,请选择“应用程序服务器”来访问消息队列。确保在详细信息页上已选中“MSMQ HTTP 支持”选项。单击“确定”退出详细信息页,然后单击“下一步”。完成安装。

如何在C#中使用MSMQ



MSMQ (Microsoft消息队列)是Windows中默认可用的消息队列。作为跨计算机系统发送和接收消息的可靠方法,MSMQ提供了一个可伸缩、线程安全、简单和使用方便的队列,同时为你提供了在Windows数据库中持久化消息的机会。MSDN指出:“消息队列(MSMQ)技术使在不同时间运行的应用程序能够在可能暂时离线的异构网络和系统之间进行通信。应用程序将消息发送到队列并从队列读取消息。”

在使用MSMQ时,通常有两个不同的应用程序——发送者和接收者。当消息由发送者发送时,接收者应用程序不需要处于执行状态——消息实际上存储在由主机操作系统维护的队列中,当接收方应用程序需要它们时,这些消息就会脱离队列。

01

创建一个队列

你可以通过控制面板上的“打开或关闭Windows功能”选项打开你系统中的MSMQ。在系统中安装了MSMQ之后,创建队列就很简单了。只要到“我的电脑”,右击并选择管理。在“计算机管理”窗口中,你可以从“消息队列”节点创建一个新队列。还可以通过编程方式创建队列。


02

C#中的MSMQ

要使用MSMQ,你需要引入System.Messaging命名空间。要以编程方式创建队列,需要利用MessageQueue类的Create方法。下面的代码片段说明了这一点。

MessageQueue.Create(@".\Private$\IDG");

要创建队列并向其发送消息,可以使用以下代码片段:

messageQueue = new MessageQueue(@".\Private$\IDG");messageQueue.Label = "This is a test queue.";messageQueue.Send("This is a test message.", "IDG");

现在,假设你想检查队列是否存在,如果存在,则发送一条消息给它。如果队列不存在,你可能希望创建一个新队列,然后向它发送消息。这正是下面的代码清单所做的。

static void Main(string[] args){ MessageQueue messageQueue = null; string description = "This is a test queue."; string message = "This is a test message."; string path = @".\Private$\IDG"; try { if (MessageQueue.Exists(path)) { messageQueue = new MessageQueue(path); messageQueue.Label = description; } else { MessageQueue.Create(path); messageQueue = new MessageQueue(path); messageQueue.Label = description; } messageQueue.Send(message); } catch { throw; } finally { messageQueue.Dispose(); }}

下面的代码清单演示了如何使用c#处理存储在消息队列中的消息。

private static List<string> ReadQueue(string path){ List<string> lstMessages = new List<string>(); using (MessageQueue messageQueue = new MessageQueue(path)) { System.Messaging.Message[] messages = messageQueue.GetAllMessages(); foreach (System.Messaging.Message message in messages) { message.Formatter = new XmlMessageFormatter( new String[] { "System.String, mscorlib" }); string msg = message.Body.ToString(); lstMessages.Add(msg); } } return lstMessages;}

接下来,可以调用ReadQueue方法来检索存储在消息队列中的消息,如下面的代码片段所示。

string path = @".\Private$\IDG";List<string> lstMessages = ReadQueue(path);

你还可以在消息队列中存储对象。例如,假设你需要将日志消息存储到队列中。日志消息存储在LogMessage类的一个实例中,该实例包含与日志消息的详细信息相关的必要属性。下面是LogMessage类的样子——我只使用了两个属性来使它变得简单。

public class LogMessage{ public string MessageText { get; set; } public DateTime MessageTime { get; set; }}

你应该修改LogMessage类,以包含其他必要的属性,例如,消息严重性等。下面的方法说明了如何将LogMessage类的实例存储到消息队列中。

private static void SendMessage(string queueName, LogMessage msg){ MessageQueue messageQueue = null; if (!MessageQueue.Exists(queueName)) messageQueue = MessageQueue.Create(queueName); else messageQueue = new MessageQueue(queueName); try { messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(LogMessage) }); messageQueue.Send(msg); } catch { //Write code here to do the necessary error handling. } finally { messageQueue.Close(); }}

下面的代码片段说明了如何创建LogMessage类的实例,向其填充数据,然后调用SendMessage方法来存储在消息队列中创建的实例。

LogMessage msg = new LogMessage(){ MessageText = "This is a test message.", MessageTime = DateTime.Now};SendMessage(@".\Private$\IDGLog", msg);

下面的代码清单演示了如何读取存储在消息队列中的LogMessage实例。

private static LogMessage ReceiveMessage(string queueName){ if (!MessageQueue.Exists(queueName)) return null; MessageQueue messageQueue = new MessageQueue(queueName); LogMessage logMessage = null; try { messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(LogMessage) }); logMessage = (LogMessage)messageQueue.Receive().Body; } catch { } finally { messageQueue.Close(); } return logMessage;}


以上是关于如何清空Windows消息队列的主要内容,如果未能解决你的问题,请参考以下文章

如何使电脑重启后,消息队列中的消息还在

RabbitMQ管理台Purge大量消息堆积队列风险

8.windows消息机制消息队列

消息队列和缓存的区别

消息队列 NSQ 源码学习笔记

拒绝访问消息队列系统