5

使用 WCF netMSMQbinding 时是否可以保证有序交付?

我们在同一个队列中放置一个插入命令,然后是多个更新命令,有时其中一个更新会超过插入。

添加大量日志后,很明显它们以正确的顺序添加到队列中,并以不同的顺序进行处理。

我已经设法谷歌了几篇文章,指出这种行为是预期的,但似乎必须可以将其配置为以某种方式订购。

我们的队列是事务性的,所以我不认为在目的地添加序列号和重新排序会起作用,因为这会失去事务性

如果我添加属性[DeliveryRequirements(RequireOrderedDelivery=true, QueuedDeliveryRequirements=QueuedDeliveryRequirementsMode.Require)],我会收到以下错误:

合同“IService”上的 DeliveryRequirementsAttribute 指定了 NotAllowed 的 QueuedDeliveryRequirements 值。但是,此合同的配置绑定指定它确实支持排队交付。此合同不得使用排队绑定。

我不知道为什么会出现此错误,因为一切“似乎”都设置正确。我还没有找到任何确认 MSMQ 允许此设置,因为它似乎是 WS-RM 设置,并且 AFAIK netMSMQBinding 不支持 WS-RM。

4

3 回答 3

3

MSMQ 不支持有序交付,因此您不能。

看一下 System.ServiceModel.Channels.MsmqBindingElementBase+BindingDeliveryCapabilitiesHelper ,它是指定 MSMQ 绑定功能的类,以及它如何实现该属性:

bool IBindingDeliveryCapabilities.AssuresOrderedDelivery
{
    get
    {
        return false;
    }
}
于 2009-04-08T13:17:36.590 回答
2

来自 Simon Gittins 的这篇文章似乎表明可以订购交货:

事实证明,有一个未记录的功能可以处理这种情况:

  • 将批处理大小为 ONE 的 TransactedBatchingBehavior 应用到服务端点。
  • ReleaseServiceInstanceOnTransactionComplete 必须在服务实现上设置为 true。

一旦完成这两件事,我的测试程序就不再产生乱序消息。

于 2009-08-17T11:53:11.427 回答
1

看起来您可以对消息进行分组,因此您可以在合同中指定顺序。查看这篇关于消息分组的 MSDN 文章

于 2009-04-10T16:28:33.267 回答