队列引用建议
更新:2007 年 11 月
如果创建 MessageQueue 组件的实例,则需要指示希望组件与之通信的队列。有三种方法可以在代码中引用一个队列:
通过路径 — 唯一标识计算机和感兴趣的队列的名称的路径。
通过格式名 — 队列的唯一标识符,创建队列时由 MSMQ 生成,或者后来由应用程序生成。
通过标签 — 可能不唯一的描述性队列名称,创建队列时由队列管理员指派。
在创建新队列而不是 MessageQueue 组件的新实例时,必须使用路径。创建了队列后,由“消息队列”系统指派格式名和标签。但是,当在代码中或从“工具箱”引用现有队列时,可以选择自己要使用的引用方法。所选择的任何方法均存储在组件的 Path 属性中。
使用路径引用队列
队列路径采用 servername\queuename 形式。指向队列的路径总是唯一的。下表列出用于每种类型的队列的路径信息:
队列类型 |
路径中使用的语法 |
---|---|
公共队列 |
MachineName\QueueName |
专用队列 |
MachineName\Private$\QueueName |
日记队列 |
MachineName\QueueName\Journal$ |
计算机日记队列 |
MachineName\Journal$ |
计算机死信队列 |
MachineName\Deadletter$ |
计算机事务性死信队列 |
MachineName\XactDeadletter$ |
您可以使用 "." 代表本地计算机名称,这样 "YourMachine\MyQueue" 等同于 ".\MyQueue"。
以下是关于使用路径引用队列的几点忠告:
当“消息队列”服务器上的域控制器收到通过路径引用的队列操作时,它必须解析该路径并确定所引用队列的格式名。这可能导致性能稍微低于直接通过格式名引用队列时的性能。
如果要将组件设计为用作 XML Web services,则使用引用队列的格式名方法而不是路径方法,可获得最佳的性能结果。
如果要在队列断开连接时向其发送消息,则不能通过路径引用该队列。断开连接的消息必须使用格式名发送。
通过查询和组合 MessageQueue 基类中两个单独属性(MachineName 属性和 QueueName 属性)的返回结果,可以检索队列的路径。
按路径引用队列的代码如下所示:
MessageQueue1.Path = "YourMachine\MyQueue"
MessageQueue1.Path = @"YourMachine\MyQueue";
说明: |
---|
C# 的 @".\MyQueue" 语法与使用 ".\\MyQueue" 等效。@ 符号指示一个字符串。有关更多信息,请参见 string(C# 参考)。 |
使用格式名引用队列
格式名采用指示队列是公共还是专用的字符串格式,后跟为该队列生成的 GUID 和其他所需的标识符。下表列出用于每种类型的队列的路径信息:
队列类型 |
格式名中使用的语法 |
---|---|
公共队列 |
FORMATNAME:PUBLIC=QueueGUID |
专用队列 |
FORMATNAME:PRIVATE=MachineGUID\QueueNumber |
日记队列 |
FORMATNAME:PUBLIC=QueueGUID;JOURNAL - 或 - FORMATNAME:PRIVATE=MachineGUID\QueueNumber;JOURNAL |
不要给队列指派格式名;而是在创建队列时由队列管理器生成此值。通过格式名引用队列是访问队列的最直接方法,因为服务器上的域控制器不必像通过路径引用队列时那样解释该引用。
以下是关于通过格式名引用队列的几点提示:
如果打算向断开连接的队列发送消息,则必须通过格式名而不是路径引用该队列。这是因为在队列脱机的情况下,将无法解析路径。
注意,当网络拓扑结构改变或删除并重新创建队列时,格式名可能会变得无效。
可通过查询 MessageQueue 类中的 FormatName 属性来检索队列的格式名。
按格式名引用队列的代码如下所示:
MessageQueue1.Path = _
"FORMATNAME:PUBLIC=3d3dc813-c555-4fd3-8ce0-79d5b45e0d75"
MessageQueue1.Path =
"FORMATNAME:PUBLIC=3d3dc813-c555-4fd3-8ce0-79d5b45e0d75";
使用标签引用队列
还可通过队列的标签引用队列,标签是由队列管理员赋予队列的一个描述性文本标签。标签不总是唯一的,因此如果在试图使用特定队列的标签连接到该队列时存在名称冲突,将会收到错误信息。
对于队列在计算机间进行移动的情况,标签非常有用。如果仅通过标签引用队列,当队列已被移动到新的位置后,只要新的计算机上不存在带该标签的其他队列,所有操作都将成功地继续进行。如果存在带该标签的其他队列,Send 方法将产生错误。
可通过查询 MessageQueue 类中的 Label 属性来检索队列的标签。
按标签名引用队列的代码如下所示:
MessageQueue1.Path = "LABEL:MyQueue"
MessageQueue1.Path = "LABEL:MyQueue";