¿Cómo configuro la prioridad en el lado del cliente del mensaje MSMQ enviado a un servicio WF activado a través de MQ

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

Pregunta

Tengo una configuración de servicio de flujo de trabajo activado de WCF (XAMLX) (alojado con WorkFlowserviceHost).

Este servicio web WCF tiene un enlace 'NETMSMQBINDING' y un punto final basado en NET.MSMQ que utiliza los clientes para programar operaciones.

En el lado del cliente, he usado Visual Studio para generar el proxy Stub para comunicarse con este servicio WCF.Todo está funcionando bien y puedo ver los mensajes que aparecen en mi MQ (diario) en el servidor y WCF, recogiendo mensajes de la cola para activar el flujo de trabajo configurado en función del mensaje.

Necesito controlar la prioridad de los mensajes que se envían a MQ para que ciertos clientes de WCF puedan obtener el procesamiento priorizado de sus flujos de trabajo.

Parece que NetMSMqBinding no respalda realmente la priorización de mensajes MQ.¿Es esto correcto?Si es así, ¿cómo puedo lograr / simular esto?¿Puedo usar los disparadores MQ para cambiar la prioridad de los mensajes basados en algunas banderas?

¿Fue útil?

Solución

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

Otros consejos

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top