使用netMSMQbinding进行有序交付

时间:2009-04-08 11:42:03

标签: wcf msmq messaging ordered-delivery

使用WCF netMSMQbinding时是否可以保证订购交付?

我们在同一个队列上放置一个insert命令后跟一些更新命令,偶尔会有一个更新击败插入。

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

我已经向谷歌设法了几篇文章,声明这种行为是预期的,但似乎必须可以将其配置为以某种方式进行排序。

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

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

  

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

我不知道为什么我们会收到此错误,因为所有内容都“正确”设置正确。我没有设法找到任何确认允许MSMQ使用此设置,因为它似乎是WS-RM设置,而AFAIK netMSMQBinding不支持WS-RM。

3 个答案:

答案 0 :(得分:3)

MSMQ不支持有序递送,因此您不能。

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

bool IBindingDeliveryCapabilities.AssuresOrderedDelivery
{
    get
    {
        return false;
    }
}

答案 1 :(得分:2)

This post from Simon Gittins看起来它表明订购的交付是可能的:

  

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

     
      
  • 将批量大小为1的TransactedBatchingBehavior应用于服务端点。
  •   
  • 必须在服务实现上将ReleaseServiceInstanceOnTransactionComplete设置为true。
  •   
     

完成这两件事后,我的测试程序不再产生无序消息。

答案 2 :(得分:1)

看起来您可以对邮件进行分组,因此您可以在合同中指定订单。看看这个MSDN article on grouping messages