我有一个WCF激活的WorkFlow服务(XAMLX)设置(使用WorkflowServiceHost托管)。
这个WCF WebService有一个' NetMsMqBinding'绑定和基于net.msmq的端点,客户端使用该端点来安排操作。
在客户端,我使用Visual Studio生成代理存根以与此WCF服务进行通信。一切正常,我可以看到服务器上的(日志)MQ中出现的消息,WCF从队列中拾取消息,根据消息激活配置的工作流。
我需要控制发送到MQ的消息的优先级,以便某些WCF客户端可以优先处理其工作流。
似乎NetMsMqBinding并不真正支持MQ消息优先级。它是否正确?如果是这样,我怎样才能实现/模拟这个?我可以使用MQ触发器根据某些标志更改消息的优先级吗?
答案 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