Как установить Приоритет на стороне клиента сообщения MSMQ, отправляемого в Сервис WF, активированный через MQ - PullRequest
2 голосов
/ 09 марта 2012

У меня настроена служба WorkFlow (XAMLX), активированная WCF (размещена с помощью WorkflowServiceHost).

Этот WCF WebService имеет привязку NetMsMqBinding и конечную точку на основе net.msmq, которая используется клиентами для планирования операций.

На стороне клиента я использовал Visual Studio для генерациизаглушка прокси для связи с этой службой WCF.Все работает нормально, и я вижу сообщения, появляющиеся в моем (занесенном в журнал) MQ на сервере, и WCF получает сообщения из очереди, чтобы активировать настроенный рабочий процесс на основе сообщения.

Мне нужноуправлять приоритетом сообщений, отправляемых в MQ, чтобы некоторые клиенты WCF могли получать приоритетную обработку своих рабочих процессов.

Кажется, что NetMsMqBinding на самом деле не поддерживает приоритезацию сообщений MQ.Это правильно?Если так, как я могу достичь / смоделировать это?Могу ли я использовать MQ Triggers для изменения приоритета сообщений на основе некоторых флагов?

Ответы [ 2 ]

4 голосов
/ 14 августа 2012

Публикация моего решения, на случай, если кому-то понадобится выяснить это

NetMSMQBinding не поддерживает установку приоритета сообщения со стороны клиента, поэтому я использовал неправильную привязку. Более мощный MsMqIntegrationBinding - верный путь.

Клиентская сторона: Со стороны клиента нужно просто создать объект System.Messaging.Message, установить приоритет и поместить его в объект MessageQueue.MessageQueue, который указывает на целевой MQ.

Сторона сервера: Хост-проекту WorkflowService для размещения WCF требуется следующая конечная привязка в файле 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 как System.ServiceModel.MsmqIntegrationMessage<YourTypeGoesHere> Теперь у вас будет доступ к этому MsmqMessage<yourType> из вашего ActivityContext, где вы можете получить значение, отправленное в сообщении.

Это очень полезный и мощный способ создания масштабируемой, управляемой с помощью управления приоритетами веб-службы на основе MQ + WCF + WF

1 голос
/ 09 марта 2012

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

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

...