2012-05-03 22 views
7

Sto cercando di capire come funziona il multicasting in MSMQ ma non riesco a ricevere messaggi nemmeno dalla stessa macchina. Ovviamente sto facendo qualcosa di sbagliato ma non riesco a vedere cosa.MSMQ - Impossibile ricevere da code Multicast

Ecco dove sono a:

ho creato manualmente una coda privata non transazionale chiamato MulticastTest e quindi impostare l'indirizzo multicast per 234.1.1.1:8001. Poi il mio test di invio di app fa questo:

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

Questo funziona, almeno sembra per inviare il messaggio che vedo in una coda in uscita sulla stessa macchina. Almeno suppongo che sia corretto, per favore dimmi se non lo è.

Così ora provo a eseguire l'app di ricezione (sulla stessa macchina o su un'altra diversa configurata sullo stesso indirizzo multicast) e non riesco a farla funzionare. Se provo questo:

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

Semplicemente non funziona, il metodo Receive() genera un'eccezione dicendo:

Il nome del formato specificato non supporta l'operazione richiesta. Ad esempio, un nome di formato diretto di coda non può essere cancellato

Se provo e impostare la coda di ricezione come .\private$\MulticastTest almeno attende un messaggio, ma non succede nulla, tutti i messaggi ancora rimangono nella coda in uscita.

Quindi cosa sto sbagliando? È necessario eseguire un qualche tipo di servizio per MSMQ per inviare messaggi dalla coda in uscita?

Ho anche provato a dare le autorizzazioni complete all'utente ANONIMO come da this question ma ciò non ha alcun effetto.

risposta

8

Dopo molte sperimentazioni ho finalmente capito i passaggi corretti necessari per far funzionare le code multicast.

Prima di tutto, assicurati di aver installato la funzione Multicast MSMQ! Nonostante sia stato in grado di creare una coda con un indirizzo multicast su uno dei miei server, Server Manager mi ha effettivamente detto che il componente non è stato installato.

Dopo aver provato questo fuori sulla mia macchina locale, invece ho trovato questo messaggio nel mio ceppo di evento:

Message Queuing trovato più indirizzi IP per il computer locale. Accodamento messaggi utilizzerà l'indirizzo IP predefinito determinato dal driver PGM per i messaggi multicast. Per utilizzare un indirizzo IP diverso, impostare la HKLM \ Software \ Microsoft \ MSMQ \ Parameters \ MulticastBindIP registro valore \ a uno dei seguenti indirizzi IP validi: [indirizzi IP elencati qui]

Si scopre I aveva più indirizzi IP per la mia rete locale, quindi prima ho aggiunto questa chiave del Registro di sistema utilizzando l'indirizzo IP corretto necessario per inviare messaggi e quindi riavviare il servizio Accodamento messaggi.Maggiori dettagli possono essere trovati qui: https://technet.microsoft.com/en-us/library/cc770813%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396

Successivamente ho dovuto aggiungere autorizzazioni alla mia coda di messaggi per l'utente ANONYMOUS LOGON, quindi ho dato (almeno) le autorizzazioni di ricezione e invio.

Ora per inviare qualcosa. Il formato corretto del nome della coda necessario è il seguente:

FormatName:MULTICAST=234.1.1.1:8001 

o qualsiasi sia l'indirizzo IP/porta multicast. La mia app di invio ora ha inviato il messaggio e ho potuto vedere che ora appare nella mia coda privata che è legata a questo indirizzo multicast. Ciò significa che il messaggio è stato definitivamente inviato.

sul lato sbagliato, ho bisogno di ascoltare la coda privata (non il formato multicast sopra), quindi mi ascolta su:

.\private$\MulticastTest 

Finalmente vedo il messaggio che ho inviato appaiono sul lato sbagliato.

Come controllo di integrità ho impostato un'altra coda che punta allo stesso indirizzo multicast (assicurandomi che su quella macchina ho seguito gli stessi passaggi precedenti) e ora posso inviare un messaggio da una macchina e riceverlo da più macchine.

Spero che questa risposta sia di aiuto agli altri in quanto è stato un vero sforzo per tentativi ed errori per me.

+0

Ciao Peter, ho seguito questi passaggi ancora non sono in grado di ricevere un messaggio in macchina diversa, funziona bene nella stessa macchina, ho visto quel messaggio nel registro eventi, suggeriva 2 IP nel messaggio, ho aggiunto la chiave con quell'IP –

+0

Il collegamento tecnico è morto. Potresti aggiornarlo o rimuoverlo? –

+1

@SeanB sostituito il collegamento con un altro che si spera trasmetta le giuste informazioni, è stato un po 'di tempo fa! –

0

ho risolto il mio problema stesso dall'altro senso:

  1. Creare coda privata con indirizzo multicast.
  2. Crea coda nel produttore entro il prossimo

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

    MessageQueue mq = new MessageQueue (QUEUE_PATH)

  3. Crea coda consumatore successiva (ogni utente ha un nome diverso!):

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

const string QUEUE_PATH = @;

MessageQueue mq =! MessageQueue.Exists (QUEUE_PATH)? MessageQueue.Create (QUEUE_PATH): new 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): new MessageQueue (QUEUE_PATH);

mq.MulticastAddress = "234.1.1.1: 8001" ;

fonti possono essere trovati qui: https://github.com/constructor-igor/TechSugar/tree/master/MessageQueue

Impostazioni breve spiegazione può essere trovata: https://github.com/constructor-igor/TechSugar/wiki/MessageQueue