如何在客户端设置发送到通过MQ激活的WF服务的MSMQ消息的优先级

时间:2012-03-09 11:23:41

标签: wcf workflow-foundation-4 msmq netmsmqbinding msmq-wcf

我有一个WCF激活的WorkFlow服务(XAMLX)设置(使用WorkflowServiceHost托管)。

这个WCF WebService有一个' NetMsMqBinding'绑定和基于net.msmq的端点,客户端使用该端点来安排操作。

在客户端,我使用Visual Studio生成代理存根以与此WCF服务进行通信。一切正常,我可以看到服务器上的(日志)MQ中出现的消息,WCF从队列中拾取消息,根据消息激活配置的工作流。

我需要控制发送到MQ的消息的优先级,以便某些WCF客户端可以优先处理其工作流。

似乎NetMsMqBinding并不真正支持MQ消息优先级。它是否正确?如果是这样,我怎样才能实现/模拟这个?我可以使用MQ触发器根据某些标志更改消息的优先级吗?

2 个答案:

答案 0 :(得分:3)

发布我的解决方案,以防有人需要弄明白

NetMSMQBinding不支持从客户端设置消息优先级,因此我使用了错误的绑定。更强大的MsMqIntegrationBinding是正确的方法。

客户方: 从客户端,只需创建一个System.Messaging.Message对象,设置优先级并将其放在指向目标MQ的MessageQueue.MessageQueue对象中。

服务器端: WorkflowService托管WCF项目需要web.config中的以下endpointBinding:


<endpoint address="msmq.formatname:DIRECT=OS:.\private$\MyWebService/MyProcessingService.xamlx" binding="msmqIntegrationBinding" bindingConfiguration="MyMsMqIntegrationBinding" contract="IMyProcessingService" name="MqIntegrationBindingEndPoint" />

(地址假设MQ服务是托管的WCF的本地服务)

<bindings> <!--We use msmqIntegrationBinding instead of netMsmqBinding since we want to control priority of MQ messages being dropped in the queue and that is not supported in netMsmq --> <msmqIntegrationBinding> <binding name="MyMsMqIntegrationBinding" exactlyOnce="false"> <security mode="None" /> </binding> </msmqIntegrationBinding>


从MQ接收MsmqMessage并处理它的方法是在XAMLX中删除“Receive”活动,并选择Message作为内容定义MessageType为System.ServiceModel.MsmqIntegrationMessage<YourTypeGoesHere>现在您将有权访问从您MsmqMessage<yourType>的{​​{1}}到ActivityContext,您可以在其中检索邮件中发送的值。

这是一种非常有用且强大的方法,可以使用基于MQ + WCF + WF的优先级控制Web服务构建可伸缩,受限制的

答案 1 :(得分:1)

这些交易消息是?如果是这样,您根本无法更改优先级。

邮件是不可变的,因此您无法更改已发送的非事务性邮件的优先级。

干杯
John Breakwell