Come posso impostare la priorità sul lato client del messaggio MSMQ inviato a un servizio WF attivato tramite MQ

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

Domanda

Ho una configurazione del servizio di workflow del workflow WCF (XAMLX) (ospitato utilizzando WorkFlowserviceHost).

Questo wcf WebService ha un legame 'netmsmqbinding' e un endpoint basato su net.msmq che viene utilizzato dai client per pianificare le operazioni.

Sul lato client, ho usato Visual Studio per generare lo stub proxy per comunicare a questo servizio WCF.Tutto funziona bene e posso vedere i messaggi che appaiono nel mio MQ (Journeded) MQ sul server e nel WCF raccogliendo i messaggi dalla coda per attivare il flusso di lavoro configurato in base al messaggio.

Devo controllare la priorità dei messaggi inviati a MQ in modo che alcuni client WCF possano ottenere l'elaborazione prioritaria dei loro flussi di lavoro.

Sembra che NetmsMQBinding non supporti la priorità del messaggio MQ.È corretto?Se è così, come posso ottenere / simulare questo?Posso usare i trigger MQ per modificare la priorità dei messaggi in base a alcuni flag?

È stato utile?

Soluzione

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

Altri suggerimenti

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top