使用WCF netMSMQbinding时是否可以保证订购交付?
我们在同一个队列上放置一个insert命令后跟一些更新命令,偶尔会有一个更新击败插入。
添加了大量日志记录后,很明显它们会以正确的顺序添加到队列中,并以不同的顺序进行处理。
我已经向谷歌设法了几篇文章,声明这种行为是预期的,但似乎必须可以将其配置为以某种方式进行排序。
我们的队列是事务性的,所以我不认为在目的地添加序列号和重新排序会起作用,因为这会丢失事务性
如果我添加属性[DeliveryRequirements(RequireOrderedDelivery=true, QueuedDeliveryRequirements=QueuedDeliveryRequirementsMode.Require)]
,我会收到以下错误:
合同'IService'上的DeliveryRequirementsAttribute指定了一个 QueuedDeliveryRequirements NotAllowed的值。但是,已配置 此合同的绑定指定它确实支持排队交付。一个 排队绑定不得与此合同一起使用。
我不知道为什么我们会收到此错误,因为所有内容都“正确”设置正确。我没有设法找到任何确认允许MSMQ使用此设置,因为它似乎是WS-RM设置,而AFAIK netMSMQBinding不支持WS-RM。
答案 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。