MSMQ – Imansible ricevere da code Multicast

Sto cercando di capire come funziona il multicasting in MSMQ ma non riesco a ricevere alcun messaggio, nemmeno dalla stessa macchina. Ovviamente sto facendo qualcosa di sbagliato ma non riesco a vedere cosa.

Ecco dove sono:

Ho creato manualmente una coda privata non transazionale denominata MulticastTest e quindi impostato l’indirizzo multicast su 234.1.1.1:8001 . Quindi la mia app di invio test fa questo:

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

Funziona, sembra almeno 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 la mia 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 funzionerà, il metodo Receive() genera un’eccezione dicendo:

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

Se provo a impostare la coda di ricezione come .\private$\MulticastTest , attende almeno un messaggio ma non accade nulla, tutti i messaggi 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 per l’utente ANONYMOUS come da questa domanda, ma ciò non ha alcun effetto.

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 sul mio computer locale ho trovato questo messaggio nel mio registro eventi:

Accodamento messaggi ha 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 il valore del registro \ HKLM \ Software \ Microsoft \ MSMQ \ Parameters \ MulticastBindIP su uno dei seguenti indirizzi IP validi: [Indirizzi IP elencati qui]

Risulta che ho avuto 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 che ti serve è il seguente:

 FormatName:MULTICAST=234.1.1.1:8001 

o qualunque sia il tuo 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 ricevente, ho bisogno di ascoltare la coda privata (non il formato multicast sopra), quindi ascolto:

 .\private$\MulticastTest 

Finalmente vedo il messaggio che ho inviato apparire sul lato ricevente.

Come controllo di integrità ho impostato un’altra coda puntando 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.

Ho risolto lo stesso problema in altro modo:

  1. Crea coda privata con indirizzo multicast.
  2. Crea coda in produttore per il prossimo

    const string QUEUE_PATH = @ “formatname: MULTICAST = 234.1.1.1: 8001”

    MessageQueue mq = new MessageQueue (QUEUE_PATH)

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

consumer1:

const string QUEUE_PATH = @ “. \ Private $ \ MSMQ-Task3-Consumer-1”;

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

mq.MulticastAddress = “234.1.1.1:8001”;

consumer2:

const string QUEUE_PATH = @ “. \ Private $ \ MSMQ-Task3-Consumer-2”;

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

mq.MulticastAddress = “234.1.1.1:8001”;

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

È ansible trovare una spiegazione delle impostazioni brevi: https://github.com/constructor-igor/TechSugar/wiki/MessageQueue