WCF + MSMQ 4: 谁将消息从重试队列移回应用程序队列?

4
这是一个简单的问题,但我找不到答案。假设我的消息被放置到重试队列中(谁创建了重试队列?是WCF还是MSMQ服务?),5分钟后(这是我的重试延迟),该消息将返回应用程序队列。问题是:超时后谁将消息从重试队列移动到应用程序队列?额外的问题是:延迟是如何跟踪的?消息是否获得“移动”时间戳和“重试”时间戳?
3个回答

2
在MSMQ 4.0中,WCF提供了自动重试和毒消息处理功能(点击此处查看)。尽管Hugh的回答对于旧版本的MSMQ是正确的。根据评论中的编辑,为了确定将消息移动到重试队列和恢复队列的过程,我会认为它是MSMQ服务本身,因为这是MSMQ 4.0的新功能。WCF参与包装所有此活动的事务,并且当然处理由MSMQ放置在队列中的消息。

谢谢你告诉我这个新功能,我之前不知道。 - tom redfern
我的客户在高交易量的电子商务环境中使用它已经一年多了,非常可靠。有时还挽救了他们的局面 :) - Sixto Saez
我看过那篇文章,但不是很清楚"将消息移动到重试队列"的操作由谁执行?因为重试参数是在WCF绑定中定义的,所以感觉像是WCF(即Web服务)应该负责这个操作,但同时重试也是MSMQ 4的一个功能。这就让我感到困惑了。 - THX-1138
我对将消息移动到重试队列的内部机制一无所知,但我猜测除了定义重试参数之外,WCF 在该过程中并未参与。由于这是 MSMQ 4.0 中的新功能,因此我认为所有消息移动都是由 MSMQ 内部完成的。WCF 将受到事务包装此处理和在消息返回常规队列时进行“重新处理”的影响。 - Sixto Saez
我认为这是一个合理的推论。请将其放在答案中。 - THX-1138

1

标准的 msmq 绑定(netMsmqBindingmsmqIntegrationBinding)不支持重试。所以回答你的问题:

谁创建了重试队列? - 你自己。

在超时后,谁将消息从重试队列移动到应用程序队列中? - 你自己。

如何跟踪延迟? - 你必须自己做。

NServiceBus 是开源的,可以使用 MSMQ 进行传输。该产品提供了开箱即用的重试功能,但不使用 WCF。

更新

以上内容适用于 MSMQ 3 及以下版本。


0
根据这篇文章 处理毒消息,MSMQ 4 提供了一些新功能,允许应用程序使用子队列处理毒消息。 这些功能包括:
  • 终止计数器
  • 移动计数器
  • 能够在主队列和子队列之间以及子队列之间移动消息。

因此,似乎实际的移动是由 WCF 处理的,而 MSMQ 简单地现在具有支持毒消息和重试处理的设施。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接