2

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

此 WCF WebService 具有“NetMsMqBinding”绑定和基于 net.msmq 的端点,客户端使用该端点来安排操作。

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

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

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

4

2 回答 2

4

发布我的解决方案,以防有人需要解决这个问题

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

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

服务器端: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 中删除“接收”活动并选择Message内容定义 MessageType 作为System.ServiceModel.MsmqIntegrationMessage<YourTypeGoesHere>现在您可以MsmqMessage<yourType>ActivityContext可以检索发送的值的位置访问它信息。

这是一种非常有用且强大的方式来构建一个可扩展的、具有优先级控制的节流基于 MQ+WCF+WF 的 Web 服务

于 2012-08-14T05:59:27.913 回答
1

这些是事务性消息吗?如果是这样,您根本无法更改优先级。

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

干杯
约翰·布雷克韦尔

于 2012-03-09T12:57:31.623 回答