我有一个服务,它通过WCF将内容插入到MSMQ中。但是,在将任何消息插入队列之前可能需要很长时间,即不存在队列的错误时。
我的想法是遍历WCF配置并检查启动时队列是否存在。 MSMQ WCF端点的地址格式为net.msmq://machine/private/queue
。
给定net.msmq格式的WCF MSMQ地址,如何在不排队实际消息的情况下检查此队列是否存在?
修改
专用队列可以与服务位于同一台计算机上,也可以存在于远程服务器上。
答案 0 :(得分:1)
您可以使用MessageQueue.Exists方法检查队列是否存在。请注意,您必须使用标准的MSMQ寻址格式
FORMATNAME:DIRECT=OS:(server name)\PRIVATE$\(queue name)
但是,在初始化发件人类型之前检查邮件队列是否存在,这首先会破坏使用邮件排队的目的。
您希望使用排队的一个原因是您的发件人无需了解接收方端点的可用性。它并不关心,因为即使接收器队列不可用,它仍然可以发送消息。
它可以这样做的原因是因为MSMQ实现了存储转发消息传递模式,这意味着任何发送的消息首先存储在本地然后发送。这使发送方与目标端点上的故障隔离,并确保消息不会丢失。
这也意味着没有错误消息表明队列地址指向不存在的队列。该消息将在可配置的时间后超时并被标记为无法传送。
更新正如John Breakwell在评论中指出的那样:不是这样。 MSMQ消息将被传递到远程队列管理器,如果队列不存在,则被丢弃。如果启用了负源日记功能,则会将丢弃的邮件的副本放入发件人的相应死信队列中
希望这有帮助。
<强>更新强>
在我看来,有一种情况是您希望在发送之前检查是否存在队列,这是因为您是根据某些业务规则以编程方式生成队列的。
答案 1 :(得分:0)
您可以使用MSMQ的WMI性能计数器来检查您感兴趣的队列是否存在。 VBScript code in this post显示了您需要使用的MSMQ WMI对象。此blog post显示如果目标计算机上缺少该怎么办。您需要将基于VBScript代码的.NET组件放在链接中,以供您的服务使用。