使用消息组件
本文内容
更新:2007 年 11 月
使用 MessageQueue 组件,可以在应用程序中内置复杂的消息处理功能。使用 MessageQueue 组件的实例,可以在网络中轻松地向/从任何队列发送/接收消息。
XML Web services 提供另一种将消息类型行为并入应用程序中的方法。利用 XML Web services,可以在 Web 应用程序与任何客户端之间来回传递信息。有关更多信息,请参见使用托管代码进行 Web 服务编程简介。
使用 MessageQueue 组件,可以轻松地将基于消息的通信合并到应用程序中。使用此组件及其关联的语言功能,可以发送和接收消息,浏览现有的队列,创建和删除队列,以及用简单的编程模型执行各种其他操作。
本节内容
-
消息处理介绍
提供有关消息处理功能的基本信息。 -
消息组件“如何”帮助主题
提供有关使用消息组件编程的所有“如何”页的链接。 -
消息队列和消息处理技术背景知识
解释基本的消息概念并提供指向更多信息的链接。 -
MessageQueue 编程结构
描述 MessageQueue 组件编程中使用的语言元素。 -
创建、删除和管理队列
推荐有关在“服务器资源管理器”中查找、创建和删除消息队列的其他页。 -
发送和序列化消息
推荐有关下列内容的其他页:向各种类型的队列发送简单消息和复杂消息、请求确认、使用日记以及在消息中发送数据集。 -
读取和接收消息
推荐有关下列内容的其他页:分步读取消息、处理异步操作以及查看队列中的消息。 -
消息队列安全性
提供有关对发送和接收的消息进行加密和身份验证的概述。 -
MessageQueue 组件疑难解答
解释如何解决此组件的常见问题。
消息处理介绍
本文内容
更新:2007 年 11 月
利用 Microsoft Windows“消息队列”,应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信。消息处理为您提供了有保障的消息传递和执行许多业务处理的可靠的防故障方法。例如,假设有一个必须每周七天,每天 24 小时运行的零售销售点应用程序。如果此应用程序后面的数据库系统出现故障,销售人员可能需要开始手动处理订单。通过使用“消息队列”,可以设置系统,将停机期间无法处理的订单放入队列并在数据库恢复后立即处理它们。
在 Microsoft Visual Studio 和 Microsoft Windows 软件开发工具包 (SDK) 中,可以使用 MessageQueue 组件的实例快捷方便地连接到现有的消息队列,检查它们的内容并发送和接收消息。此外,还可以使用“服务器资源管理器”在任何可以访问的服务器上查看消息队列,并查看有关这些队列中包含的消息的信息。可以将一个队列从“服务器资源管理器”添加到组件的设计器中,以自动创建被配置为与该队列交互的组件。
同消息队列交互
消息处理和消息为基于服务器的应用程序组件之间的进程间通信提供了强大灵活的机制。同组件间的直接调用相比,它们具有若干优点,其中包括:
-
稳定性 — 组件失败对消息的影响程度远远小于组件间的直接调用,因为消息存储在队列中并一直留在那里,直到被适当地处理。消息处理同事务处理相似,因为消息处理是有保证的。
-
消息优先级 — 更紧急或更重要的消息可在相对不重要的消息之前接收,因此可以为关键的应用程序保证足够的响应时间。
-
脱机能力 — 发送消息时,它们可被发送到临时队列中并一直留在那里,直到被成功地传递。当因任何原因对所需队列的访问不可用时,用户可以继续执行操作。同时,其他操作可以继续进行,如同消息已经得到了处理一样,这是因为网络连接恢复时消息传递是有保证的。
-
事务性消息处理 — 将多个相关消息耦合为单个事务,确保消息按顺序传递、只传递一次并且可以从它们的目标队列中被成功地检索。如果出现任何错误,将取消整个事务。
-
安全性 - MessageQueue 组件基于的消息队列技术使用 Windows 安全来保护访问控制、提供审核并对组件发送和接收的消息进行加密和验证。
限制
系统必须满足以下要求,才能够开发 MessageQueue 组件:
-
若要在“服务器资源管理器”中查看队列信息或以编程方式访问队列,必须在客户端计算机上安装“消息队列”。
-
“消息队列”可在域环境或工作组环境中运行。在“消息队列”上下文中,域环境包括提供 Active Directory 这类目录服务的域控制器,而工作组环境是任何不提供这类目录服务的环境。
安装“消息队列”时,选择要连接到的主“消息队列”服务器。不能查看或操作驻留在其他主“消息队列”服务器上的队列。
消息队列和消息处理技术背景知识
本文内容
更新:2007 年 11 月
利用 Microsoft Windows“消息队列”,应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信。如果您不熟悉 MessageQueue 技术,本页为您提供了一些基本术语和概念的简要概述。
消息处理中的主要概念
message 是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。
消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
“消息队列”(Microsoft 消息处理技术)为任何应用程序提供消息处理和消息队列功能。此外,它还在装有 Microsoft Windows 的计算机的任意组合之间提供消息处理和消息队列功能,这与这些计算机是否在同一个网络上或者是否同时联机无关。
“消息队列网络”是能够相互间来回发送消息的任何一组计算机。网络中的不同计算机在确保消息顺利处理的过程中扮演不同的角色。它们中有些提供路由信息以确定如何发送消息,有些保存整个网络的重要信息,而有些只是发送和接收消息。
“消息队列”安装期间,管理员确定哪些服务器可以互相通信,并设置特定服务器的特殊角色。构成此“消息队列”网络的计算机称为“站点”,它们之间通过“站点链接”相互连接。每个站点链接都有一个关联的“开销”,它由管理员确定,指示了经过此站点链接传递消息的频率。
“消息队列”管理员还在网络中设置一台或多台作为“路由服务器”的计算机。路由服务器查看各站点链接的开销,确定经过多个站点传递消息的最快和最有效的方法,以此决定如何传递消息。
下图显示了“消息队列”站点的典型配置以及它们的交互方式:
站点间的消息路由
队列类型
有两种主要类别的队列:由您或网络中的其他用户创建的队列和系统队列。用户创建的队列可能是以下任何一种队列:
-
“公共队列”在整个“消息队列”网络中复制,并且有可能由网络连接的所有站点访问。
-
**“专用队列”**不在整个网络中发布。相反,它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。
-
**“管理队列”**包含确认在给定“消息队列”网络中发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列(如果有的话)。
-
**“响应队列”**包含目标应用程序接收到消息时返回给发送应用程序的响应消息。指定希望 MessageQueue 组件使用的响应队列(如果有的话)。
系统生成的队列一般分为以下几类:
-
**“日记队列”**可选地存储发送消息的副本和从队列中移除的消息副本。每个“消息队列”客户端上的单个日记队列存储从该计算机发送的消息副本。在服务器上为每个队列创建了一个单独的日记队列。此日记跟踪从该队列中移除的消息。
-
**“死信队列”**存储无法传递或已过期的消息的副本。如果过期消息或无法传递的消息是事务性消息,则被存储在一种特殊的名为“事务性死信队列”的死信队列中。死信存储在过期消息所在的计算机上。有关超时期限和过期消息的更多信息,请参见默认消息属性。
-
**“报告队列”**包含指示消息到达目标所经过的路由的消息,还可以包含测试消息。每台计算机上只能有一个报告队列。
-
**“专用系统队列”**是一系列存储系统执行消息处理操作所需的管理和通知消息的专用队列。
在应用程序中进行的大多数工作都涉及访问公共队列及其消息。但是,根据应用程序的日记记录、确认和其他特殊处理需要,在日常操作中很可能要使用几种不同的系统队列。
同步和异步通信
队列通信在本质上是“异步”的,因为将消息发送到队列和从队列中接收消息是在不同的进程中完成的。另外,还可以异步执行接收操作。希望接收消息的用户可以针对任何给定的队列调用 BeginReceive 方法,然后立即执行其他任务,而无需等待回复。这与人们所了解的“同步通信”截然不同。
在同步通信中,请求的发送方在执行其他任务前,必须等待来自预定接收方的响应。发送方等待的时间完全取决于接收方处理请求和发送响应所用的时间。
同步和异步通信
消息的同步或异步“检索”是一个独立于消息发送的问题。消息总是异步“发送”。
有关消息队列中异步处理的更多信息,请参见异步消息处理。
消息安全性
可用如下方式帮助保护发送和接收的消息内容:
-
可使用身份验证验证应用程序接收的消息的来源。
-
可使用加密确保未经授权的人无法读取或使用您的消息。
-
可以使用访问控制权限,用基于 ACL 的安全性限制用户并用代码访问安全性限制代码向计算机上的特定队列发送消息或从中读取消息。
-
可使用审核记录尝试访问“消息队列”对象的用户,尝试的操作类型,以及该访问成功还是失败。
有关更多信息,请参见消息队列安全性。
安装“消息队列”
如果要在代码或“服务器资源管理器”中使用消息队列,则必须在开发计算机上安装“消息队列”。在 Windows 2000 或 Windows NT 文档中可以找到有关如何安装“消息队列”的说明。在安装时,必须指定正在创建的新主“消息队列”服务器所起的作用:是充当新网络的集线器、现有网络的独立客户端还是现有网络的依赖客户端。多数情况下,不用创建新的网络,而是可以加入公司或工作组的现有“消息队列”网络。
MessageQueue 编程结构
本文内容
更新:2007 年 11 月
MessageQueue 组件使用 Microsoft .NET Framework 命名空间的以下部分:
向 Visual Studio 项目添加 MessageQueue 组件的实例时,系统会自动创建访问这些命名空间和类所需的引用和导入语句。如果正在 Visual Studio 项目的代码中创建 MessageQueue 组件,需要添加对 System.Messaging.dll 的引用,并向代码中添加导入(在 Visual Basic 中)或使用(在 C# 中)System.Messaging 的语句。有关添加和移除项目引用的说明,请参见 如何:在 Visual Studio 中添加或移除引用 (Visual Basic)。
如果正在使用 .NET Framework 开发应用程序,编译时需要添加对 System.Messaging.dll 的引用。此外,还需要向代码中添加导入(在 Visual Basic 中)或使用(在 C# 中)System.Messaging 的语句。有关在编译过程中包括引用的信息,请参见 /reference (Visual Basic) 或 /reference(导入元数据)(C# 编译器选项)。
MessageQueue 基类中的主要编程元素
可以使用下列方法与 MessageQueue 组件的实例进行交互:
-
使用 Exists 方法查看特定消息队列是否存在。
-
使用 GetPublicQueues 方法在消息队列网络中定位消息队列。
-
使用 Receive 和 BeginReceive 方法检索指定队列前面的消息,并将其从该队列中移除。
-
使用 Send 方法向指定队列发送消息。
通过使用“服务器资源管理器”查看消息处理服务器,可以查看有关消息队列安装的详细信息。有关更多信息,请参见 如何:在服务器资源管理器中查找队列。此外,还可以通过使用与消息队列一起自动安装的“消息队列资源管理器”,获取有关消息队列网络配置的详细信息。
演练:创建队列和使用消息
本文内容
更新:2007 年 11 月
本主题中的过程演示使用 MessageQueue 组件创建消息队列的过程。通过使用该组件,可以向队列发送消息并在队列中检索消息。该消息记录帮助请求。
若要在“服务器资源管理器”中查看队列信息或以编程方式访问队列,必须在客户端计算机上安装“消息队列”Windows 组件。若要添加此服务,请使用“控制面板”中的“添加或删除程序”。
在您的计算机上创建消息队列
-
在“文件”菜单上指向“新建”,然后单击“项目”。
-
在“新建项目”对话框中,创建 Visual Basic 或 Visual C# 的“Windows 应用程序”。将其命名为 MessageQ。
-
打开“服务器资源管理器”。有关更多信息,请参见 如何:访问和初始化服务器资源管理器/数据库资源管理器。
-
展开“服务器”节点。
-
展开本地服务器的节点。按计算机名识别本地服务器的节点。
-
展开“消息队列”节点。
-
右击“专用队列”,然后单击创建队列。
-
为该队列名称输入 HelpRequest。不要选中“使队列具有事务性”。
-
一个名为“HelpRequest”的新专用队列被创建并出现在“服务器资源管理器”中。
您还可以通过“我的电脑”图标查看新创建的队列。右击桌面上的“我的电脑”图标,然后单击“管理”。展开“服务和应用程序”节点。展开“消息队列”节点并选择“专用队列”文件夹。新队列出现在队列列表中。
为您的消息队列添加 MessageQueue 组件
-
将 HelpRequest 队列从“服务器资源管理器”拖到窗体上。为“HelpRequest”队列配置的新 MessageQueue 组件将添加到项目中。
MessageQueue 组件用于以编程方式访问在上一节中创建的“HelpRequest”队列中所包含的消息。
-
将 MessageQueue 组件的“(Name)”属性设置为 helpRequestQueue。
-
在“属性”窗口中,展开 MessageReadPropertyFilter 节点。将“Priority”的值设置为 true。这样,当从队列中检索消息时,同时会检索消息的优先级。
您在下一个步骤中创建的用户界面允许用户输入一些帮助请求文本并设置消息的优先级。用户单击“发送”按钮将请求发送到队列。一个 DataGridView 控件显示队列的内容。用户界面还包含用队列的当前内容更新网格的按钮和清除队列的按钮。
创建用户界面
-
在“工具箱”的“Windows 窗体”选项卡中,将以下控件添加到 Form1:
-
两个 Label 控件
-
两个 TextBox 控件
-
三个 Button 控件
-
一个 CheckBox 控件
-
一个 DataGridView
-
-
设置以下控件属性:
表 4 控件
属性
新值
Label1
名称
Label2
消息
TextBox1
txtName
(空白)
TextBox2
txtMessage
(空白)
true
Button1
sendMessage
发送消息
Button2
refreshMessages
刷新消息列表
Button3
purgeMessages
清除消息列表
CheckBox1
highPriority
高优先级
DataGridView1
messageGrid
-
整齐地排列控件。
向队列发送消息
-
在设计器中,双击 sendMessage 按钮以在“代码编辑器”中创建 Click 事件处理程序。
-
在方法中添加代码以创建新的 Message 实例并将其发送到队列,并更新消息显示。下一步中将编写 DisplayMessages 方法。
private void sendMessage_Click(object sender, System.EventArgs e) { System.Messaging.Message theMessage = new System.Messaging.Message(txtMessage.Text); theMessage.Label = txtName.Text; if (highPriority.Checked) theMessage.Priority = System.Messaging.MessagePriority.Highest; else theMessage.Priority = System.Messaging.MessagePriority.Normal; helpRequestQueue.Send(theMessage); DisplayMessages(); }
-
向项目添加 System.Data 引用。为 System.Data 添加 Imports 语句(.NET 命名空间和类型) (Visual Basic) 或 using(C# 参考) 语句。有关更多信息,请参见管理引用和如何:在 Visual Studio 中添加或移除引用 (Visual Basic)。
-
添加方法以在 DataGridView 控件中显示队列的内容。该方法使用 MessageQueue.GetAllMessages 方法来检索队列中的所有消息。将选定的队列属性添加到 DataTable 对象,该对象用作 DataGridView 控件的数据源。若要检索消息的文本,您必须为消息创建格式化程序。
private void DisplayMessages() { DataTable messageTable = new DataTable(); messageTable.Columns.Add("Name"); messageTable.Columns.Add("Message"); messageTable.Columns.Add("Priority"); System.Messaging.Message[] messages; messages = helpRequestQueue.GetAllMessages(); System.Messaging.XmlMessageFormatter stringFormatter; stringFormatter = new System.Messaging.XmlMessageFormatter( new string[] {"System.String"}); for (int index = 0; index < messages.Length; index++) { messages[index].Formatter = stringFormatter; messageTable.Rows.Add(new string[] { messages[index].Label, messages[index].Body.ToString(), messages[index].Priority.ToString() }); } messageGrid.DataSource = messageTable;
}
显示队列的内容
-
在设计器中,双击 refreshMessage 按钮以在“代码编辑器”中创建 Click 事件处理程序。
-
在 Click 事件处理程序中调用 DisplayMessages 方法。
private void refreshMessages_Click(object sender, System.EventArgs e) { DisplayMessages();
}
清除队列的内容
-
在设计器中,双击 purgeMessage 按钮以在“代码编辑器”中创建 Click 事件处理程序。
-
调用 helpRequestQueue 的 Purge 方法,然后刷新 DataGridView 控件的内容。
private void purgeMessages_Click(object sender, System.EventArgs e) { helpRequestQueue.Purge(); DisplayMessages();
}
测试应用程序
-
按 F5 运行应用程序。
-
键入名称和短消息。
-
单击“发送消息”将消息发送到队列并更新显示。
-
单击“清除消息”以删除队列中的所有消息。消息列表将为空。
请参见
任务
如何:在服务器资源管理器中查找队列
本文内容
更新:2007 年 11 月
使用“服务器资源管理器”,可以浏览能够访问的任何计算机上的现有队列。您可以查看这些计算机上所有可用的公共队列、专用队列或系统队列(包括在 Visual Studio 中创建的那些队列)。
也可以在 Windows 2000 的“计算机管理”窗口中,或在设置 MessageQueue 组件实例的路径时出现的“创建消息队列”对话框中看到有关队列的信息。
在服务器资源管理器上定位队列
-
展开“服务器”节点,然后展开要查看的服务器的节点。
如果没有列出要查看的服务器,则需要添加该服务器。有关更多信息,请参见如何:访问和初始化服务器资源管理器/数据库资源管理器。 -
定位并展开其下的“消息队列”节点。
如果“消息队列”节点无法展开,它旁边会显示一个错误图标。这意味着正试图在其上查看队列的计算机上没有安装“消息队列”。有关如何安装和配置“消息队列”的信息,请参见“消息队列”文档。 -
根据正在试图查找的队列类型,展开“公共队列”、“专用队列”或“系统队列”。
如果域较大,或者域控制器使用较早版本的“消息队列”,展开公共消息队列可能需要一段时间。请使用“消息队列”2.0 版或更高版本,以获取最佳性能。 -
展开要处理的队列的节点。
在“计算机管理”窗口的“消息队列”中查找队列
-
在计算机桌面上,右击“我的电脑”,然后单击“管理”。
-
在出现的对话框中,展开“服务和应用程序”节点。
-
展开“消息队列”节点。随即出现计算机上的队列的完整列表。
请参见
参考
如何:创建队列
本文内容
更新:2007 年 11 月
创建队列以提供消息处理组件可与之交互的资源。例如,假设要生成一个订单输入系统,该系统在收到来自销售人员或网站上客户直接交互的订单后,将其放入队列中。开始时可以在“消息队列”企业版上创建一个“订单输入”队列。为处理订单创建的所有组件都将同此队列交互。
有两种创建队列的方法:使用“服务器资源管理器”窗口或使用代码中的 Create 构造函数。可以使用“服务器资源管理器”或 Windows 2000 的“计算机管理”窗口来验证队列是否已成功创建。
可以在自己的计算机上或享有域或者企业管理访问权限的任何“消息队列”计算机上创建公共队列。还可以仅在本地计算机上创建专用队列。有关访问权限的更多信息,请参见消息队列安全性,或者参见“计算机管理”窗口的文档中的“消息队列的访问控制”。
还可将安装组件配置为当部署应用程序时创建或定位现有队列。有关更多信息,请参见部署中的自定义操作管理。
从服务器资源管理器创建队列
-
打开“服务器资源管理器”,访问要在其中创建队列的服务器。有关更多信息,请参见如何:访问和初始化服务器资源管理器/数据库资源管理器。
向 Visual Studio 项目添加 MessageQueue 组件的实例时,系统会自动创建访问这些命名空间和类所需的引用和导入语句。
-
右击“消息队列”节点。
-
根据要创建的队列类型,右击“公共队列”或“专用队列”,然后单击“创建队列”。
-
在“创建消息队列”对话框中,键入队列的名称。
-
如果要使队列成为事务性队列,请选择“使队列具有事务性”。有关更多信息,请参见事务性消息处理。
如果域较大且域中具有许多域控制器,则创建公共消息队列所需的时间可能要比预期的时间长。这是因为新公共队列需要花些时间从您的计算机的域控制器复制到域中所有其他域控制器。在此远程复制过程中,您可能会经历延迟
以编程方式创建公共队列
-
右击项目并选择“添加引用”。添加对 System.Messaging.dll 的引用。
-
使用 Create 方法在计算机上创建公共队列。您的代码应类似于:
System.Messaging.MessageQueue.Create(@"myMachine\MyQueue");
请注意,在创建消息队列时,该资源可能已经存在。另一进程(可能是恶意进程)可能已创建了资源,并拥有对该资源的访问权。将数据放入消息队列后,其他进程就可使用这些数据了。有关现有队列的信息,请参见如何:检索队列。
以编程方式创建专用队列
-
使用 Create 方法,指定所需的语法 Private$,以便在计算机上创建专用队列。您的代码应类似于:
System.Messaging.MessageQueue.Create(@".\Private$\MyPrivateQueue");
可以使用“服务器资源管理器”窗口或 Windows 2000 的“计算机管理”窗口来验证是否已创建消息队列。
验证是否已创建消息队列
-
在“服务器资源管理器”中,右击“队列”,然后单击“刷新”以刷新“消息队列”节点。队列的显示可能要花费一段时间。
- 或 -
-
若要在 Windows 2000 中查看消息队列信息,请按以下步骤操作:
-
右击桌面上的“我的电脑”,然后单击“管理”。
-
在出现的对话框中,展开“服务和应用程序”节点,然后展开“消息队列”。可在此节点中找到队列及其消息。
-
请参见
任务
如何:删除队列
本文内容
更新:2007 年 11 月
可以使用两种方法删除本地计算机上存在的队列:从代码中删除或者从“服务器资源管理器”中删除。如果具有适当的访问权限,则可以删除本地计算机上的任何公共队列或专用队列。若要删除本地队列,必须具有由队列所有者分配的完全控制访问权限或显式的“消息队列”访问权限,才能从该计算机上删除与队列相关的项。不能删除其他计算机上的队列。
从服务器资源管理器中删除消息队列
-
打开“服务器资源管理器”,然后展开服务器的节点。
-
展开“消息队列”节点并定位要删除的队列。
-
右击该队列,然后单击“删除”。
如果域较大或域中具有多个域控制器,则删除公共消息队列所需的时间可能要比预期的时间长。这是因为删除命令需要花些时间从计算机的域控制器复制到域中所有其他域控制器。在此远程复制过程中,您可能会经历延迟。
以编程方式删除消息队列
-
使用 Delete 方法可以删除要删除的队列。代码应类似于:
System.Messaging.MessageQueue.Delete(@"myMachine\MyQueue");
此示例显示通过路径引用的队列。还可通过格式名或标签引用要删除的队列。有关更多信息,请参见队列引用建议。
请参见
任务
如何:清除队列内容
本文内容
更新:2007 年 11 月
可以使用 Purge 方法清除“消息队列”系统中您有权访问的任何队列的内容。例如,假设在本地“消息队列”客户端上使用日记队列记录送出的所有消息的副本。当日记达到其大小上限时,您可以使用 Purge 方法清除不再需要的项。
如何:清除队列内容
存储在日记和死信队列中的消息计数以队列所在计算机的配额为限。当到达此配额时,这些队列停止接受新消息。如果在应用程序中使用日记和死信队列,定期从这些队列中清除不再需要的消息很重要。
若要删除队列的内容,必须在“消息队列”中具有接收权限。清除队列时,它包含的所有消息不发送即被丢弃。可以从代码或“服务器资源管理器”中清除队列的内容。
从“服务器资源管理器”中清除队列的内容
-
打开“服务器资源管理器”,然后展开要清除的队列所在的服务器节点。
如果“服务器”节点中未列出所需的服务器,请右击“服务器”,单击“添加服务器”,输入服务器的名称,然后单击“确定”。 -
展开“消息队列”节点。
-
展开要删除其中的消息的队列。您将看到该队列的消息及其关联日记消息的一个或多个节点。
-
右击要清除的消息节点,然后单击“清除消息”。
以编程方式清除队列的内容
-
使用 Purge 方法可以清除适当队列的内容。代码应类似于:
System.Messaging.MessageQueue MessageQueue1 = new System.Messaging.MessageQueue(); MessageQueue1.Path = @".\MyQueue"; MessageQueue1.Purge();
此代码示例也可用作 IntelliSense 代码段。在代码段选择器中,此代码示例位于“Windows 操作系统”>“消息队列”中。有关更多信息,请参见如何:在代码中插入代码段 (Visual Basic)。
请参见
任务
如何:创建 MessageQueue 组件实例
本文内容
更新:2007 年 11 月
当需要使应用程序内置消息处理功能时,可以创建 MessageQueue 组件。使用 MessageQueue 组件,可以连接到现有队列,发送和接收消息,以及使用非常少的代码为应用程序添加通信服务。例如,假设要生成一个订单输入系统,该系统在收到来自销售人员或网站上客户直接交互的订单后,将其放入队列中。开始时可以向项目中添加 MessageQueue 组件的一个实例,然后将其配置为与消息队列服务器上现有的 OrderEntry 队列进行交互。
可以向 Windows 窗体、Web 窗体和组件类添加 MessageQueue 组件的实例。MessageQueue 组件没有可视的用户界面。如果向可视化设计器(如 Windows 窗体设计器)中添加 MessageQueue 组件的实例,该组件将出现在窗体下边框下面一个很小的区域中。此区域称为组件栏,用作显示与窗体关联的所有非可视项的位置。
说明: |
---|
从 Component 继承的非可视化类支持类似于组件栏的可视化设计图面,MessageQueue 组件和其他组件排列在该图面上。此设计器上项的排列并不重要,因为您所看到的该界面从不向应用程序的最终用户显示。 |
有关如何配置 MessageQueue 组件的说明,请参见消息队列配置属性。
有多种创建 MessageQueue 组件的实例的方法:
-
可以从“工具箱”的“组件”选项卡上将 MessageQueue 组件的一个实例拖到窗体或组件设计器上。
-
可以在“服务器资源管理器”中定位所需的队列,然后将其添加到设计器中,从而创建一个预先配置为指向该队列的 MessageQueue 组件的实例。
-
可以通过代码创建 MessageQueue 组件的实例。
从“工具箱”创建 MessageQueue 组件的实例
-
访问“工具箱”的“组件”选项卡。
-
选择 MessageQueue 图标并将它拖放到窗体或组件的设计器图面上。
-
配置组件。有关更多信息,请参见消息队列配置属性。
通过服务器资源管理器创建 MessageQueue 组件的实例
-
打开“服务器资源管理器”。有关更多信息,请参见如何:访问和初始化服务器资源管理器/数据库资源管理器。
-
展开“服务器”节点,确定此节点是否列出了要在其上驻留队列的服务器。
表 2 提示: 如果没有列出要查看的服务器,则需要添加该服务器。有关更多信息,请参见如何:访问和初始化服务器资源管理器/数据库资源管理器。
-
展开要查看的服务器的节点,然后在它下面找到并展开“消息队列”节点。
表 3 说明: 如果未展开“消息队列”节点,则说明试图在其上查看队列的计算机未安装“消息队列”。有关如何安装和配置“消息队列”的信息,请参见 Windows 2000 或 Windows NT 消息队列文档。
-
定位要添加到项目中的队列,然后右击它。
-
单击“添加到设计器”。
-
配置组件。有关更多信息,请参见消息队列配置属性。
以编程方式创建 MessageQueue 组件的实例
-
通过代码创建 MessageQueue 类的实例,然后设置 Path 以确定希望组件引用的现有队列。您的代码可能类似于:
System.Messaging.MessageQueue myMQ = new System.Messaging.MessageQueue(); myMQ.Path = @".\MyNewQueue";
表 4 提示: 还可以通过使用以下格式,将步骤 1 和步骤 2 并为一个步骤:
System.Messaging.MessageQueue myMQ2 = new System.Messaging.MessageQueue(@".\MyNewQueue");
表 5 说明: 可以通过队列的路径、自动生成的队列格式名或队列的非唯一描述性标签来引用队列。每种引用队列的方法各有优缺点。有关更多信息,请参见队列引用建议。
-
为队列配置其他任何必需的属性。有关更多信息,请参见消息队列配置属性。
消息队列配置属性
本文内容
更新:2007 年 11 月
对于所创建的队列和 MessageQueue 组件,可以操作各种属性。可以定义这些属性以帮助设置指导队列行为的值,或者可以查询这些属性以检索有关与组件交互的队列的信息。
引用队列的属性
使用 Path 属性可以确定组件引用的队列。可以使用三种方法标识路径:通过队列的物理路径、通过队列的格式名或者通过队列的描述性标签。有关路径、格式名和标签之间的区别的完整说明,请参见队列引用建议。
队列还可以按类别分类。可以使用 Category 属性确定所要处理的队列的类型。Category 是一个可由队列所有者定义的 GUID。可以使用 GUID 生成工具,也可以构成自己的 GUID 号。除了在单个类别内,Category 的 GUID 不必是唯一的。例如,可以为所有的订单处理队列定义相同的类别。这将允许通过该 GUID 检索所有这些队列。
确定可发送的数据类型的属性
使用 Formatter 属性可以确定向队列发送消息前如何将消息内容序列化为消息,以及从队列中接收消息后如何提取消息内容。如果设置 Formatter 属性,则能够确定可以在消息中发送的内容的类型。有关更多信息,请参见消息序列化。
控制同队列的交互的属性
可使用以下属性控制组件同队列交互的方式:
-
可以使用 DenySharedReceive 属性指示一次仅有一个组件可以查看队列中的消息。在多用户环境中,这会极其有用。设置 DenySharedReceive 后,第一个查看队列或从队列中接收消息的组件是当时可以执行这些操作的唯一组件。当第一个组件完成该队列的实例后,它通过垃圾回收或通过调用 Close 释放该队列。有关垃圾回收的更多信息,请参见垃圾回收。
-
可以使用 CanRead 和 CanWrite 属性确定您对特定的队列是否有读写访问权限,或者可以将队列设置为允许读写访问权限。
-
可以使用 MaximumQueueSize 和 MaximumJournalSize 属性确定队列可以接收的消息容量(以千字节计)。到达此最大值时,队列不再接受消息。默认情况下,最大队列大小默认为系统管理员为“消息队列”设置的队列大小。如果未设置任何限制,默认的队列大小为无穷大。
-
可以使用 UseJournalQueue 属性确定是否向日记队列添加从队列中检索到的消息的副本。
发送和序列化消息
本文内容
更新:2007 年 11 月
Microsoft Windows“消息队列”中的消息由正文和一组属性组成。消息正文可以包含文本或任何形式的二进制信息,并可被加密。通过在“属性”窗口中设置属性值或用代码设置所需的值,以编程方式设置消息的正文和属性。一条消息(包括正文和所有指定的属性)的大小不能大于 4 MB。
可以用 MessageQueue 组件创建和发送消息。在应用程序中创建的消息可以发送到任何公共、专用、日记、死信或事务性队列中。
如何:发送简单消息
本文内容
更新:2007 年 11 月
使用 MessageQueue 组件的实例,只需两行代码,即可将简单的消息发送到队列。发送简单消息时,必须执行以下操作:
-
创建与要向其发送消息的队列的连接。
-
为要发送的数据指定适当的格式化程序。格式化程序控制可在消息中发送的数据类型和保持数据的方式。在简单的情况中,可以接受默认的格式化程序。有关更多信息,请参见消息序列化。
-
调用 Send 方法,并传递要发送的对象。
创建队列连接
决定要与之通信的队列后,需要创建引用要使用的队列的 MessageQueue 组件实例。可以通过“工具箱”、项目的“服务器资源管理器”或使用 MessageQueue 构造函数创建此组件。
创建要与之通信的队列连接
-
创建 MessageQueue 组件的实例。有关更多信息,请参见如何:创建 MessageQueue 组件实例。
-
使用组件的 Path 属性,并通过队列的路径、格式名或标签连接到要与之通信的队列。
表 1 说明: 如果通过“服务器资源管理器”创建组件,Path 属性将自动设置为该队列的队列路径。
提供要发送的数据
除非在个别的消息中另外指定,否则每个 MessageQueue 组件均包含一系列应用于该组件发送的所有消息的默认属性。在最简单的方案中,可以使用为该组件设置的默认属性向队列发送简单消息。有关这些属性的更多信息,请参见默认消息属性。
使用 Send 方法指定消息并将其发送到队列。可在简单消息中发送对象、基元数据类型、流和其他数据类型。
MessageQueue 组件获取您在 Send 方法的参数中指定的数据,将其保持到消息中,然后将该消息发送到指定队列。
发送简单消息
-
在 MessageQueue 组件的“属性”窗口中,接受 Formatter 的默认值,或者将该属性设置为 XmlMessageFormatter(如果已经更改默认值)。
使用 Send 方法向队列发送一个简单的消息,并将该消息指定为方法的一个参数。
// Create a connection to the queue. System.Messaging.MessageQueue mq = new System.Messaging.MessageQueue(@".\YourQueue"); // Send an integer. mq.Send(1); // Send a string. mq.Send("Hello world");
此代码示例也可用作 IntelliSense 代码段。在代码段选择器中,此代码示例位于“Windows 操作系统”>“消息队列”中。有关更多信息,请参见如何:在代码中插入代码段 (Visual Basic)。
如何:发送复杂消息
本文内容
更新:2007 年 11 月
除了通过在 Send 方法的参数中指定消息来发送简单消息,还可以通过显式创建 Message 对象(而不是让 Send 共享方法为您创建和发送该对象)来获得对消息的更多控制。通过操作所得的 Message 对象的属性,可以创建更复杂的消息并对如何处理消息施加更多的控制。
发送复杂消息时,必须首先创建要与之通信的队列连接,然后指定要发送的数据。但是,作为指定要发送数据操作的一部分,需要在发送消息前创建 Message 类的实例,设置所需的属性并微调传递机制。与简单消息一样,系统保持消息对象并将其发送到指定的队列。
使用 Message 类发送复杂消息
-
创建 MessageQueue 组件的一个实例,并将其 Path 属性设置为要引用的队列。有关更多信息,请参见如何:创建 MessageQueue 组件实例。
表 2 说明: 如果通过“服务器资源管理器”创建组件,Path 属性将自动设置为该队列的队列路径。
-
创建 Message 对象的实例。
-
设置消息正文并指定要更改其默认值的任何属性。
-
使用 Send 方法向队列发送对象。
完成后,代码可能如下所示:
System.Messaging.MessageQueue myMQ1 = new System.Messaging.MessageQueue(@".\YourQueue"); System.Messaging.Message newMessage = new System.Messaging.Message("Hello again"); newMessage.Label = "This is the label"; myMQ1.Send(newMessage);
如何:向断开连接的队列发送消息
本文内容
更新:2007 年 11 月
消息在如下两种情况下无法迅速地传递到它们的队列:当队列驻留的计算机无法工作时,或当路由消息所需的域控制器无法工作时。通过“消息队列”,可以应对这些情况,以便在从网络上断开连接或者必要的计算机或控制器无法工作时,仍可以继续发送消息。在这些情形下,消息临时存储在本地计算机或传递路由上的某个计算机的队列中,直到完成传递所需的资源重新联机。
例如,假设有一个记录所有在出差的销售人员发送的订单的中央队列。这些销售人员每天的大部分时间都以断开连接的方式工作,记录来自客户站点的订单信息,并且每天拨号连接一次,将所有这些信息传输到中央队列中。因为消息在发送方断开连接时仍可发送到队列,所以销售人员可以在记录客户信息时立即发送他们的消息,但系统会缓存这些消息直到晚间进行拨号连接为止。
向断开连接的队列发送消息同向可用队列发送消息的过程几乎完全相同。当要向其发送的队列不可用时,不必进行任何特殊的配置以使组件将消息存储在临时队列中。有两种需要注意的主要差异:
-
如果队列不可用而域控制器还在工作,则必须通过队列的格式名而不是路径名来标识要向其发送的队列。当队列断开连接时,队列的域控制器无法正确地解析路径名。有关格式名的更多信息,请参见队列引用建议。
-
如果针对消息发送操作设置了超时间隔,将从发送消息时起开始计算超时期限。这意味着当搁置在本地计算机上的消息等待队列变得可用时,超时期限处于活动状态,而过期时间正在逼近。如果要使用超时期限,必须要么将它的时间间隔设置得足够长以允许传递,要么请求消息的否定确认,以便知道过期是否已经发生。有关在消息无法传递时请求确认的更多信息,请参见如何:请求消息的确认。
向断开连接的队列发送消息
-
创建 MessageQueue 组件的实例。有关更多信息,请参见如何:创建 MessageQueue 组件实例。
-
将组件的 Path 属性设置为要向它发送消息的队列的格式名。
表 1 说明: 如果通过“服务器资源管理器”创建组件,此属性将自动引用路径而不是格式名。若要更改为格式名,请单击 Path 属性旁的展开图标。在出现的对话框中,找到组件所引用的队列并选择它;然后选择“队列引用依据”字段中的“格式名”并单击“确定”。
-
按正常的方式发送消息。
消息确认
本文内容
更新:2007 年 11 月
可以将 MessageQueue 组件设置为生成确认消息,以通知您消息是否已成功传递。可以接收两种主要的确认类型:
-
消息到达目标队列的确认。
-
目标应用程序从队列中检索到消息的确认。
在这些方案的每一个中,还可以接收肯定确认或否定确认。在“肯定确认”中,当消息成功到达目标队列或应用程序时接收到确认消息。在“否定确认”中,当消息未能到达目标队列或应用程序时接收到确认消息。如果超时期限过期或者如果无法验证消息,消息可能无法到达其目标。
确认的处理方式
与“消息队列”中的大多数操作一样,确认也是通过向队列发送新消息来处理的。这种情况下,确认消息从目标队列发送到一个特殊类型的队列中,称为管理队列。确认消息不同于标准消息,因为它们不包含附加正文;在确认中,只有消息头中的信息才是重要的。
说明: |
---|
应用程序的确认消息发送到您在 AdministrationQueue 属性中指定的任何队列,该属性位于组件实例的 DefaultPropertiesToSend 类中或者在 Message 对象上。通过将 AcknowledgeType 属性设置为其预定值之一,确定要接收的确认类型。 |
可以用检查队列上的任何消息的相同方法(即通过查看确认队列或从中移除消息)来检查确认消息。有关更多信息,请参见读取和接收消息。
有关设置确认的说明,请参见如何:请求消息的确认。
如何:请求消息的确认
本文内容
更新:2007 年 11 月
可以对 MessageQueue 组件发送的消息请求肯定确认、否定确认或两种确认类型的组合。有关确认类型的概述,请参见消息确认。
请求消息的确认
-
创建 MessageQueue 组件的实例,并将其 Path 属性设置为要引用的队列。有关更多信息,请参见如何:创建 MessageQueue 组件实例。
-
创建要发送的消息。有关更多信息,请参见发送和序列化消息。
-
将 Message 对象的 AdministrationQueue 属性设置为确认消息的目标队列。
-
将“DefaultPropertiestoSend”区域中 Message 对象的 AcknowledgeType 属性设置为适当的值:
-
如果希望在消息到达或未能到达目标队列时收到确认,请将该属性设置为 FullReachQueue。
-
如果希望在消息的预定接收时间计时器到期前消息到达或未能从队列中被检索到时收到确认,请将该属性设置为 FullReceive。注意此确认由队列管理器生成,而不是由目标应用程序生成。
-
如果希望当未能从队列中检索到消息时收到否定确认,请将该属性设置为 NegativeReceive。
-
如果希望仅当发送的消息未能到达队列时收到确认,请将该属性设置为 NotAcknowledgeReachQueue。
-
如果希望仅当消息的目标应用程序检索不到您发送的消息时收到确认,请将该属性设置为 NotAcknowledgeReceive。
-
如果希望当消息到达其队列时收到肯定确认,请将该属性设置为 PositiveArrival。
-
如果希望当从队列中成功地检索到消息时收到肯定确认,请将该属性设置为 PositiveReceive。
表 1 提示: 有关肯定确认和否定确认的信息,请参见消息确认。
-
-
发送消息,然后在 AdministrationQueue 属性指定的队列中查找适当的确认。有关更多信息,请参见读取和接收消息。
阻止发送确认消息
- 将组件的 AcknowledgeType 属性设置为 None。
消息队列日记存储
本文内容
更新:2007 年 11 月
日记队列使您得以在处理消息时保存消息的副本。可在本地计算机日记队列中存储从您的计算机发送的消息副本,也可以在服务器上的队列日记中存储从队列中移除的消息的副本。
如果需要稍后重新发送消息,日记存储会很有用。例如,假设向队列发送了一个消息,然后收到关于未能传递该消息的否定确认。确认消息不包含原始消息的正文;而是提供一些头信息和对应于原始消息的相关 ID。如果打开了日记记录,则可以使用此相关 ID 在计算机的日记队列中定位原始消息,重新创建消息对象并重新发送它。
说明: |
---|
可以使用 ReceiveByCorrelationId 或 PeekByCorrelationId 方法,通过消息的相关 ID 对消息进行检索。请注意,多个消息可能具有同一相关 ID,这些方法将检索队列中具有给定 ID 的第一个消息。 |
关于日记队列有几点应注意的忠告:
-
每台计算机上都有一个全局日记队列。该日记队列中记录从该计算机发送的所有消息,无论这些消息是否被成功传递。另外,每个队列都有自己的关联日记队列。
-
有两个控制如何使用日记的属性。如果在 MessageQueue 对象上设置 UseJournalQueue 属性,则为该队列检索到的任何消息(而不是随该对象发送的消息)启用日记存储。随队列发送的消息将放在队列日记中。如果在 Message 对象上设置 UseJournalQueue 属性,则启用系统日记存储,这意味着从系统发送的消息将放在发送方的系统队列中。
-
日记队列有一个最大大小,称为配额。此大小受队列驻留的计算机磁盘容量的限制。达到队列容量后,已发送到日记队列的消息不再保存在系统中。出现这种情况时不引发任何错误。定期清除日记队列以防止这种情况发生很重要。有关更多信息,请参见如何:清除队列内容。
-
日记队列是静态的,即它们无法创建关于自身的确认消息,无法将移除的消息发送到死信队列或者无法处理超时。
有关设置消息的日记存储的说明,请参见如何:在日记队列中存储消息。
如何:在日记队列中存储消息
本文内容
更新:2007 年 11 月
有两种方法可以为发送的消息设置日记队列的使用:为 MessageQueue 组件设置默认属性,使该组件发送的所有消息都使用日记;或者为发送的个别消息建立日记队列记录。
有关日记存储的概述,请参见消息队列日记存储。
对 MessageQueue 组件的实例发送的所有消息使用日记
-
创建 MessageQueue 组件的一个实例,并将其 Path 属性设置为要引用的队列。有关更多信息,请参见如何:创建 MessageQueue 组件实例。
-
在“属性”窗口中,将组件的 DefaultPropertiesToSend 类中的 UseJournalQueue 属性设置为 true。
为个别消息设置日记记录
-
创建要发送的消息。
-
在代码中,将 UseJournalQueue 属性设置为 true。您的代码可能类似于:
Message1.UseJournalQueue = true;
为从队列中移除的消息设置日记记录
-
创建 MessageQueue 组件的一个实例,并将其 Path 属性设置为要引用的队列。有关更多信息,请参见 如何:创建 MessageQueue 组件实例。
-
将引用该队列的 MessageQueue 组件的 UseJournalQueue 属性设置为 true。您的代码可能类似于:
MessageQueue1.UseJournalQueue = true;
设置日记队列的最大大小
-
创建 MessageQueue 组件的一个实例,并将其 Path 属性设置为要引用的日记队列。有关更多信息,请参见如何:创建 MessageQueue 组件实例。
-
将 MaximumJournalSize 属性设置为要用于日记队列的容量(以千字节为单位)。
默认消息属性
本文内容
更新:2007 年 11 月
创建 MessageQueue 组件的实例时,您可以设置该组件发送的消息将使用的一系列默认属性。这使您在定义消息时节省了时间,并对 Send 方法有更多的控制权,而不必创建和配置 Message 对象。
说明: |
---|
只有当消息不是使用 Message 对象发送的时,才使用 DefaultPropertiesToSend 值。当使用 Message 对象发送消息时,使用的是 Message 对象的属性。 |
可以通过在“属性”窗口的 DefaultPropertiesToSend 区域设置值,或者通过设置 DefaultPropertiesToSend 对象的属性值,来设置默认的消息属性。这些默认属性控制是否生成确认消息和它们发往何处、如何加密和验证消息、消息的超时期限等功能。
本页概述了如何设置在这方面较为关键的一些属性。
消息优先级
为消息设置默认优先级将影响消息发送到目标队列的顺序。设置 Priority 属性,确定组件所发送消息的默认优先级。优先级等级默认为正常,并且包括更低或更高的优先级设置。
消息的优先级设置决定消息在队列中的位置。以高优先级发送的消息在队列中的位置较高,而优先级低的消息在队列中的位置较低。当队列接收到具有相同优先级设置的一组消息时,它们按照发送时间在队列中排列。
说明: |
---|
不能为正在向事务性队列发送的消息设置优先级,因为在事务性队列中处理消息的顺序是由事务本身决定的。 |
确认和响应属性
有几个默认属性可用来确定是否为组件的消息生成响应和确认以及如何处理这些响应。可设置为所有消息处理操作的默认属性的属性包括:
-
AcknowledgeType 和 AdministrationQueue 属性。可以利用这些属性来确定当消息到达或未能到达目标队列时,或者当目标应用程序从队列中检索消息时,是否应生成确认消息。有关更多信息,请参见如何:请求消息的确认。
-
ResponseQueue 属性,可用来为从队列中检索消息的应用程序发送的任何消息指示返回路径。这些消息不同于确认消息,因为它们由目标应用程序而不是队列管理器生成。
-
UseJournalQueue 属性,可用来确定是否应在日记队列中存储输出消息的副本。同样,可以通过设置 UseDeadLetterQueue 属性来确定是否需要将无法送达的消息发送至死信队列。
超时属性
有两个与时间相关的属性可用来帮助保持更好地控制消息。这两个属性都决定消息在被丢弃前可在系统中存在多长时间。使用 TimeToReachQueue 属性指定消息必须用多长时间尝试到达目标队列。使用 TimeToBeReceived 属性指定自消息发送时起,直到目标应用程序将其从队列中移除为止,消息在系统中保留多长时间。如果两个计时器时间间隔中的任何一个到期,“消息队列”将丢弃消息。
当消息因计时器到期而被丢弃时,队列管理器可能会采取附加步骤:
-
如果将 UseDeadLetterQueue 属性设置为 true,将向指定的死信队列发送已丢弃消息的副本。
-
如果将 AcknowledgeType 属性设置为发送否定确认,将向指定的管理队列发送确认消息。
默认情况下,没有为这两个属性设置超时间隔。如果为这两个属性都设置了值,那么 TimeToBeReceived 属性中的值优先。
消息序列化
本文内容
更新:2007 年 11 月
序列化是获取对象并将其状态信息转换为可存储或可传输形式的过程。序列化的基本思路是对象将其当前状态(通常由其成员变量的值指示)写入永久性存储。以后,通过从存储中读取对象状态或反序列化对象状态,可以重新创建该对象。序列化处理有关在序列化对象时使用的对象指针和循环对象引用的所有详细信息。
在消息队列功能中,序列化专指这样一个过程:将对象或数据集转换为可发送到队列的消息,然后将从队列中检索的消息转换回应用程序可以处理的对象或数据。
格式化程序对象处理 Visual Studio 或 .NET Framework 应用程序中的消息序列化。将消息发送到队列时,格式化程序将对象序列化到可发送到消息队列的流中。当从队列中读取消息时,格式化程序将消息数据反序列化到 Body 属性中。
应当为要发送和接收的数据类型选择适当类型的格式化程序。Visual Studio 和 .NET Framework 附带三种预定义的格式化程序,每种格式化程序旨在保持和取消保持一种不同类型的数据:
-
XmlMessageFormatter 对象使用可读的 XML 字符串将对象和基元数据类型保持到消息中和从消息中取消保持。这是 MessageQueue 组件的默认格式化程序设置。
-
BinaryMessageFormatter 对象将一个或多个连接的对象保持到序列化流中。其结果分析起来非常简洁快速,但人们无法阅读。
-
ActiveXMessageFormatter 对象保持基元数据类型,从而实现与使用“消息队列”早期版本的组件的交互。产生的序列化非常简洁。此格式化程序在设计时考虑了 Windows,并且不会产生人们可以阅读的结果。但它却是一种极为快捷的序列化方法。
默认情况下,当您创建 MessageQueue 组件实例时,会创建一个 XmlMessageFormatter,并且该格式化程序与您创建的实例关联。对 MessageQueue 实例调用 Send 方法时,会使用此格式化程序对消息正文进行序列化。发送期间,不必为使用格式化程序编写任何额外的代码。
读取消息要稍微复杂一些。若要使用格式化程序从队列中读取,必须设置属性以指示应如何处理消息正文。如果使用的是 XmlMessageFormatter 对象,请设置 TargetTypes 或 TargetTypeNames 属性。如果使用的是 BinaryMessageFormatter 对象,请设置一系列不同的属性。ActiveXMessageFormatter 对象没有关联的属性。有关更多信息,请参见读取和接收消息。
如果需要处理不同类型的数据,除了使用 Visual Studio 和 .NET Framework 附带的格式化程序外,还可以创建自己的格式化程序。可将格式化程序导入项目,并使用代码访问它。
通过为要处理的队列、消息或 MessageQueue 组件设置 Formatter 属性,选择要使用的格式化程序。
XML 消息格式设置的优点
XML 格式设置的优点之一是可以读取在序列化对象或数据时创建的字符串。这意味着如果发生了一些情况而无法从消息队列中取消保持消息,可查看消息本身并可能修复问题。
另一个优点是使用此格式化程序序列化的消息不必用同一个格式化程序对象反序列化。也就是说,如果双方知道数据的结构,接收方就不必拥有同发送方相同的格式化程序类。另外,由 XML 格式化程序序列化的消息不一定非要反序列化。大多数浏览器和其他 XML 查看器均可分析 XML 消息。
如何:在设计时验证消息
本文内容
更新:2007 年 11 月
可以使用“属性”窗口验证消息发送机制的工作是否正常。通过使用“服务器资源管理器”的“消息队列”节点,可以选择并展开队列,查看其中包含的消息,然后选择特定的消息,在“属性”窗口中查看其信息。“属性”窗口显示附加在消息中的元数据信息(到达时间、身份验证状态、相关 ID 等),还允许通过访问 BodyStream 属性来查看消息的正文。
设计时验证关于消息的信息
-
从“设计”视图中,访问“服务器资源管理器”。有关更多信息,请参见如何:访问和初始化服务器资源管理器/数据库资源管理器。
-
展开“消息队列”节点,在“公共队列”、“专用队列”或“系统队列”下定位要查看其信息的队列。
-
展开所需队列,然后在“日记消息”或“队列消息”下定位所需的消息。
-
单击一个消息。
关于该消息的信息随即显示在“属性”窗口中。
若要查看消息正文,请单击 BodyStream 属性旁的省略号按钮(“...”)。
出现“字节数组属性编辑器”对话框。
-
单击“自动”以查看 XML 格式的消息正文,或者选择一个其他合适的查看选项。
读取和接收消息
本文内容
更新:2007 年 11 月
有几种方法可从系统的队列中读取和接收消息。首先,可以从队列中接收消息,或可以在队列上查看消息而不移除它们。此外,还可以创建事件处理程序来监视新到达的消息,并在消息到达队列时自动引发事件。以下各页阐释了每一种队列消息处理方法。
本节内容
-
读取和检索消息介绍
提供有关格式化程序及其与读取和接收消息交互的概述。 -
如何:指定与消息一起检索的属性
提供有关如何指定读取消息时要检索的属性的说明。 -
如何:为检索到的消息指定格式化程序
提供有关如何指定要用于检索消息的格式化程序的说明。 -
如何:以编程方式接收消息
提供有关如何编写代码以读取和接收消息的说明。 -
如何:查看消息
提供有关如何在不将消息从队列中移除的情况下查看消息的说明。 -
异步消息处理
描述异步检索消息的过程。 -
事务性消息处理
解释如何将消息作为事务的一部分加以处理。 -
队列和消息集合
提供有关检索队列和消息的集合的基本信息。 -
如何:检索消息
提供有关如何检索消息列表的说明。 -
如何:检索队列
提供有关如何检索消息队列列表的说明。
消息队列安全性
本文内容
更新:2007 年 11 月
Microsoft Windows“消息队列”利用了 Windows 2000 操作系统的各种内置的安全功能。具体说来,“消息队列”使用访问控制、身份验证、加密和审核来获得安全性:
-
访问控制用于限制用户对“消息队列”对象的访问,并通过为对象指派安全描述符来实现。“消息队列”对象包括计算机 (MSMQ)、队列、路由链接和消息队列设置对象。安全描述符列出被授予或拒绝访问对象的用户和组,以及指派给那些用户和组的特定权限。
-
身份验证是使用公钥证书、Kerberos V5 安全协议和 Windows NTLM(为了与运行在 Windows NT 4.0 上的“消息队列”1.0 兼容)来实现的。公钥证书用于消息的身份验证,也就是向“消息队列”服务器验证消息的发送方(客户端)。Kerberos V5 和 NTLM 用于服务器身份验证,也就是向客户端验证“消息队列”服务器。
-
加密使用公钥(不对称)和密钥(对称)两者来实现。“消息队列”应用程序使用加密来加密消息队列计算机之间发送的消息。
-
审核用于记录试图访问 Active Directory 中的“消息队列”对象的用户。对象的安全描述符指定要为该对象审核的各种访问事件。
通过管理对象的安全属性,可以设置权限、指派所有权并监视用户访问。有关“消息队列”中安全性细节的更多信息,请参见 Windows 2000 或 Windows NT 消息队列文档中的“安全消息队列”,或在 MSDN Online 中搜索有关如何在 MessageQueue 组件中配置安全性的文章。
南来地,北往的,上班的,下岗的,走过路过不要错过!
======================个性签名=====================
之前认为Apple 的iOS 设计的要比 Android 稳定,我错了吗?
下载的许多客户端程序/游戏程序,经常会Crash,是程序写的不好(内存泄漏?刚启动也会吗?)还是iOS本身的不稳定!!!
如果在Android手机中可以简单联接到ddms,就可以查看系统log,很容易看到程序为什么出错,在iPhone中如何得知呢?试试Organizer吧,分析一下Device logs,也许有用.