0

我有一项服务,它通过 WCF 将内容插入 MSMQ。但是,在将任何消息插入队列之前可能需要很长时间,此时会发生不存在队列的错误。

我的想法是遍历 WCF 配置并在启动时检查队列是否存在。MSMQ WCF 端点具有格式为 的地址net.msmq://machine/private/queue

给定 net.msmq 格式的 WCF MSMQ 地址,如何在不排队实际消息的情况下检查此队列是否存在?

编辑

私有队列可以与服务存在于同一台机器上,也可以存在于远程服务器上。

4

2 回答 2

1

您可以使用MessageQueue.Exists方法检查队列是否存在。请注意,您必须使用标准的 MSMQ 寻址格式,即

FORMATNAME:DIRECT=OS:(server name)\PRIVATE$\(queue name) 

但是,在初始化您的发件人类型之前检查消息队列是否存在首先会破坏使用消息队列的目的。

您要使用排队的原因之一是您的发送方不需要知道接收方端点的可用性。它不在乎,因为即使接收者队列不可用,它仍然可以发送消息

之所以可以这样做,是因为 MSMQ 实现了存储转发消息模式,这意味着任何发送的消息都首先存储在本地,然后再发送。这使发送方免受目标端点上的故障的影响,并确保消息不会丢失。

这也意味着不会出现队列地址指向不存在的队列的错误消息。消息将在可配置的时间后超时并被标记为无法投递。

更新正如 John Breakwell 在他的评论中指出的那样:不是这样。MSMQ 消息将被传递到远程队列管理器,如果队列不存在,则被丢弃。Negative Source Journaling,如果启用,会将丢弃消息的副本放入发件人相应的死信队列

希望这可以帮助。

更新

在我看来,有一种情况是您希望在发送之前检查队列是否存在,也就是说,如果您基于某些业务规则以编程方式生成队列。

于 2011-09-20T09:34:09.503 回答
0

您可以使用 MSMQ 的 WMI 性能计数器来检查您感兴趣的队列是否存在。本文中的VBScript 代码显示了您需要使用的 MSMQ WMI 对象。这篇博客文章展示了如果目标机器上缺少它们该怎么办。您需要根据链接中的 VBScript 代码组合一个 .NET 组件,以供您的服务使用。

于 2011-09-20T13:14:14.877 回答