Как установить Приоритет на стороне клиента сообщения 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.

Это транзакционные сообщения? Если это так, вы не можете изменить приоритет вообще.

Сообщения являются неизменяемыми, поэтому вы не можете изменить приоритет нетранзакционного сообщения, которое уже было отправлено.

ура
Джон Брейквелл

Другие вопросы по тегам