【问题标题】:Given net.msmq Address, How Do I Check if this Queue Exists?给定 net.msmq 地址,如何检查此队列是否存在?
【发布时间】:2011-11-20 22:01:49
【问题描述】:

我有一个服务,它通过 WCF 将东西插入 MSMQ。但是,可能需要很长时间才能将任何消息插入队列,此时会出现不存在队列的错误。

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

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

编辑

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

【问题讨论】:

    标签: wcf msmq msmq-wcf


    【解决方案1】:

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

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

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

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

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

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

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

    希望这会有所帮助。

    更新

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

    【讨论】:

    • 重点不是在发送每条消息之前检查队列是否存在。关键是在启动时检查队列是否设置正确,所以我知道立即出现问题,而不是将来的某个随机时间。不幸的是, MessageQueue.Exists 似乎不适用于远程私有队列。我收到消息“System.InvalidOperationException 被捕获消息=无法确定是否存在具有指定格式名称的队列。”
    • 好的,我明白第二段的意思了。我可以向不存在的队列发送消息,并且不会引发错误。我想我可能会完全放弃这个想法。
    • 我认为你得到的错误是因为你的队列地址格式不正确。此外,我更新了我的答案,以扩展您想要检查队列是否存在的特殊情况。
    • 检查 MSMQ 队列是否存在是一项艰巨的工作,所以您应该为此烦恼吗? (blogs.msdn.com/b/johnbreakwell/archive/2008/07/31/…)
    • “这也意味着不会有错误消息表明队列地址指向一个不存在的队列。消息将在可配置的时间后简单地超时并被标记为无法传递。”不是这样。 MSMQ 消息将被传递到远程队列管理器,如果队列不存在,则被丢弃。 Negative Source Journaling(如果启用)会将丢弃消息的副本放入发件人相应的死信队列中。我不知道它在 WCF 中是如何显示的。
    【解决方案2】:

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

    【讨论】:

    • 性能计数器仅显示打开队列的数据。也就是说,具有>0 条消息的队列或应用程序保持打开的队列。关闭的空队列不会显示任何性能计数器数据 - 事实上,它们甚至不会出现在要监控的可用队列列表中。
    猜你喜欢
    • 2016-12-29
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多