Как установить Приоритет на стороне клиента сообщения MSMQ, отправляемого в Сервис WF, активированный через MQ
У меня есть активированная WCF установка WorkFlow Service (XAMLX) (размещенная с использованием WorkflowServiceHost).
Этот WCF WebService имеет привязку NetMsMqBinding и конечную точку на основе net.msmq, которая используется клиентами для планирования операций.
На стороне клиента я использовал Visual Studio для создания заглушки прокси для связи с этой службой WCF. Все работает нормально, и я вижу сообщения, появляющиеся в моем (занесенном в журнал) MQ на сервере, и WCF собирает сообщения из очереди, чтобы активировать настроенный рабочий процесс на основе этого сообщения.
Мне нужно контролировать приоритет сообщений, отправляемых в MQ, чтобы определенные клиенты WCF могли получать приоритетную обработку своих рабочих процессов.
Кажется, что NetMsMqBinding не поддерживает приоритезацию сообщений MQ. Это правильно? Если так, как я могу достичь / смоделировать это? Могу ли я использовать MQ Triggers для изменения приоритета сообщений на основе некоторых флагов?
2 ответа
Выкладываю моё решение на тот случай, если кому-то нужно это выяснить
NetMSMQBinding
не поддерживает установку приоритета сообщения со стороны клиента, поэтому я использовал неправильную привязку. Более мощный MsMqIntegrationBinding
это правильный путь.
Клиентская сторона: со стороны клиента нужно просто создать System.Messaging.Message
объект, установите приоритет и поместите его в MessageQueue.MessageQueue
объект, который указывает на пункт назначения MQ.
Сторона сервера: WorkflowService
для размещения проекта WCF необходимо следующее endpointBinding в файле web.config:
<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>
Чтобы получить MsmqMessage из MQ и обработать его, нужно удалить действие "Receive" в XAMLX и выбрать Message
в качестве определения содержимого MessageType as System.ServiceModel.MsmqIntegrationMessage<YourTypeGoesHere>
Теперь у вас будет доступ к этому MsmqMessage<yourType>
от твоего ActivityContext
где вы можете получить значение, отправленное в сообщении.
Это очень полезный и мощный способ создания масштабируемого, регулируемого с помощью управления приоритетами веб-сервиса на основе MQ+WCF+WF.
Это транзакционные сообщения? Если это так, вы не можете изменить приоритет вообще.
Сообщения являются неизменяемыми, поэтому вы не можете изменить приоритет нетранзакционного сообщения, которое уже было отправлено.
ура
Джон Брейквелл