Wie lege ich die Priorität auf der Clientseite der MSMQ-Nachricht an, die an einen an einen WF-Dienst übermittelt wird, der über MQ aktiviert ist

StackOverflow https://stackoverflow.com//questions/9633251

Frage

Ich habe einen WCF-Setup von WCF-Setup (XAMLX) (gehostet mit WorkflowServiceHost).

Dieser WCF-Webservice verfügt über eine "netmsmqbinding" -Bind- und einen net.msmq-basierten Endpunkt, der von Clients zum Planen von Operationen verwendet wird.

Auf der Clientseite habe ich Visual Studio verwendet, um den Proxy-Stub zu generieren, um mit diesem WCF-Dienst zu kommunizieren.Alles funktioniert gut und ich kann sehen, welche Meldungen in meinem (journanzierten) MQ auf dem Server angezeigt werden, und der WCF-Abholnachrichten von der Warteschlange, um den konfigurierten Workflow basierend auf der Nachricht zu aktivieren.

Ich muss die Priorität der an MQ gesendeten Meldungen steuern, damit bestimmte WCF-Clients eine priorisierte Verarbeitung ihrer Workflows erhalten können.

Es scheint, dass netmsmqbinding nicht wirklich MQ-Nachrichtenpriorisierung unterstützt.Ist das richtig?Wenn ja, wie kann ich das erreichen / simulieren?Kann ich MQ-Trigger verwenden, um die Priorität der Nachrichten basierend auf einigen Flags zu ändern?

War es hilfreich?

Lösung

Posting my solution, in case someone needs to figure this out

NetMSMQBinding does not support setting message priority from the client side so I was using the wrong binding. The more powerful MsMqIntegrationBinding is the right way to go.

Client side: From the client side, one needs to simply create a System.Messaging.Message object, set the priority and drop it in the MessageQueue.MessageQueue object which points to the destination MQ.

Server side: The WorkflowService hosting WCF project needs the following endpointBinding in the web.config:


<endpoint address="msmq.formatname:DIRECT=OS:.\private$\MyWebService/MyProcessingService.xamlx" binding="msmqIntegrationBinding" bindingConfiguration="MyMsMqIntegrationBinding" contract="IMyProcessingService" name="MqIntegrationBindingEndPoint" />

(the address is assuming MQ service is local to the WCF hosted)

<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>


The way to receive the MsmqMessage from the MQ and process it is by dropping a "Receive" activity in the XAMLX and choosing Message as the Content definition MessageType as System.ServiceModel.MsmqIntegrationMessage<YourTypeGoesHere> Now you'll have access to this MsmqMessage<yourType> from your ActivityContext where you can retrieve the value sent in the message.

This is a very useful and powerful way to build a scalable, throttled with priority control MQ+WCF+WF based web service

Andere Tipps

Are these transactional messages? If so, you cannot change the priority at all.

Messages are immutable so you can't change the priority of a non-transactional message that has already been sent.

Cheers
John Breakwell

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top