2012-05-03 26 views
7

Estoy tratando de entender cómo funciona la multidifusión en MSMQ pero no puedo recibir ningún mensaje, incluso desde la misma máquina. Obviamente estoy haciendo algo mal pero no puedo ver qué.MSMQ: no se puede recibir de las colas de multidifusión

Aquí es donde estoy en:

creé manualmente una cola privada no transaccional llamada MulticastTest y defina la dirección de multidifusión a 234.1.1.1:8001. Entonces mi prueba de envío de aplicación hace esto:

MessageQueue queue = new MessageQueue("FormatName:MULTICAST=234.1.1.1:8001"); 
queue.Send("Hello World"); 

Esto funciona, al menos parece enviar el mensaje que veo en una cola de salida en la misma máquina. Al menos asumo que esto es correcto, por favor dime si no es así.

Así que ahora intento ejecutar mi aplicación de recepción (ya sea en la misma máquina o en una diferente configurada para la misma dirección de multidifusión) y no puedo hacer que funcione. Si intento esto:

MessageQueue queue = new MessageQueue("FormatName:MULTICAST=234.1.1.1:8001"); 
var message = queue.Receive(); 

Simplemente no va a funcionar, el método Receive() lanza una excepción diciendo:

El nombre de formato especificado no es compatible con la operación solicitada. Por ejemplo, un nombre de formato directo cola No es posible borrar

Si trato y establecer la cola de recepción como .\private$\MulticastTest que al menos espera un mensaje, pero no pasa nada, todos los mensajes aún permanecen en la cola de salida.

Entonces, ¿qué estoy haciendo mal? ¿Se debe ejecutar algún tipo de servicio para que MSMQ envíe mensajes desde la cola saliente?

También he intentado dar permisos completos al USUARIO ANÓNIMO según this question pero eso no tiene ningún efecto.

Respuesta

8

Después de mucha experimentación, finalmente descubrí los pasos correctos que necesitaba para que las colas de multidifusión funcionen.

En primer lugar, asegúrese de tener instalada la función MSMQ Multicast. A pesar de poder crear una cola con una dirección de multidifusión en uno de mis servidores, el Administrador del servidor realmente me dijo que el componente no estaba instalado.

Después de intentar esto en mi máquina local me encontré con este mensaje en mi registro de eventos:

Message Queuing encontró varias direcciones IP para el equipo local. Message Queue Server utilizará la dirección IP predeterminada determinada por el controlador PGM para mensajes de multidifusión. Para utilizar una dirección IP diferente, establecer el \ HKLM \ Software \ Microsoft \ MSMQ \ Parameters \ MulticastBindIP registro valor a una de las siguientes direcciones IP válidas: [direcciones IP enumeradas aquí]

Resulta que yo tenía varias direcciones IP para mi red de área local, así que primero agregué esta clave de registro usando la dirección IP correcta necesaria para enviar mensajes y luego reiniciar el servicio de Message Queuing.Más detalles se pueden encontrar aquí: https://technet.microsoft.com/en-us/library/cc770813%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396

Luego tuve que agregar permisos a mi cola de mensajes para el usuario ANONYMOUS LOGON, así que di (como mínimo) los permisos de Recibir y Enviar.

Ahora para enviar algo. El formato correcto del nombre de cola que necesita es el siguiente:

FormatName:MULTICAST=234.1.1.1:8001 

o cualquiera que sea su dirección IP/puerto de multidifusión. Mi aplicación de envío ahora envió el mensaje y pude ver que ahora aparece en mi cola privada que está vinculada a esta dirección de multidifusión. Esto significa que el mensaje definitivamente ha sido enviado.

En el extremo receptor, tengo que escuchar la cola privada (no el formato de multidifusión arriba), por lo que escuchan en:

.\private$\MulticastTest 

fin ver el mensaje que envié aparece en el extremo receptor.

Como control de cordura configuré otra cola apuntando a la misma dirección de multidifusión (asegurándome de que en esa máquina seguí los mismos pasos anteriores) y ahora puedo enviar un mensaje desde una máquina y recibirlo en varias máquinas.

Espero que esta respuesta sea de ayuda para otros, ya que fue un verdadero esfuerzo de prueba y error para mí.

+0

Hola Pedro, he seguido estos pasos todavía no estoy en condiciones de recibir el mensaje de máquina diferente, funciona bien en la misma máquina, vi ese mensaje en el registro de eventos, sugería 2 IP en el mensaje, agregué la clave con esa dirección IP. –

+0

El enlace de Technet está muerto. ¿Podría actualizarlo o eliminarlo? –

+1

@SeanB reemplazó el enlace por otro que con suerte transmite la información correcta, ¡fue hace bastante tiempo! –

0

he resuelto mi problema mismo por la otra manera:

  1. Crear cola privada con dirección de multidifusión.
  2. Crear cola en el productor para el próximo

    const string QUEUE_PATH = @ "FormatName: MULTICAST = 234.1.1.1: 8001"

    MessageQueue mq = new MessageQueue (QUEUE_PATH)

  3. Crear cola de consumidor al lado (cada consumidor tiene un nombre diferente!):

consumer1: ". \ Private $ \ MSMQ-Task3-Consumer-1"

const string QUEUE_PATH = @;

MessageQueue mq =! MessageQueue.Exists (QUEUE_PATH)? MessageQueue.Create (QUEUE_PATH): nueva MessageQueue (QUEUE_PATH);

mq.MulticastAddress = "234.1.1.1:8001";

consumer2: ". \ Private $ \ MSMQ-Task3-Consumer-2"

const string QUEUE_PATH = @;

MessageQueue mq =! MessageQueue.Exists (QUEUE_PATH)? MessageQueue.Create (QUEUE_PATH): nueva MessageQueue (QUEUE_PATH);

mq.MulticastAddress = "234.1.1.1: 8001" ;

Las fuentes se pueden encontrar aquí: https://github.com/constructor-igor/TechSugar/tree/master/MessageQueue

Ajustes breve explicación puede encontrarse en: https://github.com/constructor-igor/TechSugar/wiki/MessageQueue

Cuestiones relacionadas