Pregunta

¿Es posible tener múltiples escuchas a los mensajes transmitidos por MSMQ?

WCF parece encuadrar todo en términos de servicios, haciendo de la comunicación un punto a punto. Quiero usar una cola de mensajes para amortiguar el tráfico entrante para otro proceso que registra los registros en una base de datos.

Puede haber cualquier número de otros procesos interesados ??en monitorear el tráfico entrante, y esto sugiere positivamente el patrón Observer, pero no puedo ver cómo expresar el patrón Observer, al menos no usar MSMQ a través de WCF.

¿Puede alguien aconsejarme sobre esto?


Algunos antecedentes sobre por qué me importa, que también pueden servir para ilustrar el problema: tengo un servicio de Windows que acepta solicitudes de conexión de pequeñas cajas negras en el campo. Establece sockets y las cajas negras envían mensajes que describen eventos anotados con ubicaciones GPS en tiempo y espacio.

Analizo los paquetes de mensajes de la secuencia de socket y los envío a través de MSMQ a otro proceso que filtra duplicados y escribe los paquetes en una tabla de base de datos.

Hay una cantidad de procesamiento posterior que se beneficiaría de un cálculo incremental en respuesta al tráfico entrante, y las herramientas del usuario realizan notificaciones a los usuarios también en respuesta al tráfico entrante.

Por lo tanto, realmente me gustaría tener un proceso para enviar los mensajes y varios para recibirlos. Uno de estos receptores es responsable de analizar el contenido del paquete y de transcribir el mensaje en una base de datos; Este es un candidato obvio para la responsabilidad de eliminar finalmente el mensaje de la cola, pero existe la pregunta de cómo garantizar que este sea el último controlador para procesar el mensaje.

¿Fue útil?

Solución

No creo que MSMQ esté diseñado apropiadamente para manejar esta situación por sí mismo. Solo hay 2 cosas que puedes hacer con un mensaje: Peek () u Get (). AFAIK, no hay una buena manera de rastrear si todos los manejadores han procesado un mensaje.

Lo que podría funcionar es hacer que su proceso que transcribe el mensaje sea el Observee, y publicar el mensaje (tal vez utilizando la arquitectura de eventos .NET) a todos los Observadores interesados ??antes de transcribir el mensaje y escribir en la base de datos. Esto proporcionaría una garantía de que todos los observadores interesados ??vieron el mensaje, y el mensaje se escribe en la base de datos de manera adecuada.

Otros consejos

Creo que necesitas un Canal de publicación-suscripción :

  

¿Cómo puede el remitente transmitir un evento a todos los receptores interesados?    Envíe el evento en un canal de publicación-suscripción, que entrega una copia de un determinado   evento a cada receptor.

     

Un canal de publicación-suscripción funciona así: tiene un canal de entrada   que se divide en múltiples canales de salida, uno para cada suscriptor.   Cuando un evento se publica en el canal, el Publish-Subscribe   El canal entrega una copia del mensaje a cada uno de los canales de salida.   Cada canal de salida tiene un solo suscriptor, que solo se permite   consumir un mensaje una vez. De esta manera, cada suscriptor solo obtiene la   El mensaje una vez y las copias consumidas desaparecen de sus canales.

Este patrón se implementa en la parte superior de MSMQ mediante tránsito de masas y NServiceBus .

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