MSMQ – Impossible de recevoir des files d’attente de multidiffusion

J’essaie de comprendre le fonctionnement de la multidiffusion dans MSMQ mais je ne peux pas recevoir de messages du tout, même du même ordinateur. Je fais évidemment quelque chose de mal mais je ne vois pas quoi.

Voici où je suis à:

J’ai créé manuellement une queue privée non transactionnelle appelée MulticastTest , puis 234.1.1.1:8001 défini l’adresse Multicast sur 234.1.1.1:8001 . Ensuite, mon application d’envoi de test fait ceci:

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

Cela fonctionne, il semble au moins envoyer le message que je vois dans une queue sortante sur le même ordinateur. Au moins, je suppose que c’est correct, dites-moi s’il vous plaît si ce n’est pas le cas.

Alors maintenant, j’essaie de lancer mon application de réception (sur le même ordinateur ou sur un autre ordinateur configuré avec la même adresse de multidiffusion) et je ne parviens pas à la faire fonctionner. Si j’essaye ceci:

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

Cela ne fonctionnera tout simplement pas, la méthode Receive() lève une exception en disant:

Le nom de format spécifié ne prend pas en charge l’opération demandée. Par exemple, un nom de format de queue directe ne peut pas être supprimé

Si j’essaie de définir la queue de réception comme .\private$\MulticastTest elle attend au moins un message, mais rien ne se passe, tous les messages restnt dans la queue sortante.

Alors qu’est-ce que je fais mal? Un type de service doit-il être exécuté pour que MSMQ puisse envoyer des messages à partir de la queue sortante?

J’ai également essayé de donner des permissions complètes à l’utilisateur anonyme selon cette question, mais cela n’a aucun effet.

Après de nombreuses expériences, j’ai finalement trouvé les étapes correctes nécessaires pour que les files d’attente de multidiffusion fonctionnent.

Tout d’abord, assurez-vous d’avoir installé la fonctionnalité Multicast MSMQ! Bien qu’il soit possible de créer une queue avec une adresse de multidiffusion sur l’un de mes serveurs, le Gestionnaire de serveur m’a dit que le composant n’était pas installé.

Après avoir essayé ceci sur ma machine locale, j’ai trouvé ce message dans mon journal des événements:

Message Queuing a trouvé plusieurs adresses IP pour l’ordinateur local. Message Queuing utilisera l’adresse IP par défaut déterminée par le pilote PGM pour les messages de multidiffusion. Pour utiliser une adresse IP différente, définissez la valeur de registre \ HKLM \ Software \ Microsoft \ MSMQ \ Parameters \ MulticastBindIP sur l’une des adresses IP valides suivantes: [Adresses IP répertoriées ici]

Il s’avère que j’avais plusieurs adresses IP pour mon réseau local. J’ai donc d’abord ajouté cette clé de registre à l’aide de l’adresse IP correcte nécessaire pour envoyer des messages, puis redémarrer le service Message Queuing. Plus de détails peuvent être trouvés ici: https://technet.microsoft.com/en-us/library/cc770813%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396

Ensuite, je devais append des permissions à ma file de messages pour l’utilisateur ANONYMOUS LOGON. J’ai donc accordé (au minimum) des permissions de réception et d’envoi.

Maintenant, envoyer quelque chose. Le format correct du nom de la queue dont vous avez besoin est le suivant:

 FormatName:MULTICAST=234.1.1.1:8001 

ou quelle que soit votre adresse IP / port multicast. Mon application d’envoi envoie maintenant le message et je peux voir qu’il apparaît maintenant dans ma queue privée qui est liée à cette adresse de multidiffusion. Cela signifie que le message a bien été envoyé.

Du côté de la réception, je dois écouter la queue privée (pas le format multicast ci-dessus), donc j’écoute sur:

 .\private$\MulticastTest 

Enfin, je vois que le message que j’ai envoyé apparaît sur le destinataire.

Pour vérifier l’état de santé, j’ai configuré une autre queue pointant vers la même adresse de multidiffusion (en m’assurant que sur cette machine, j’ai suivi les mêmes étapes ci-dessus) et je peux maintenant envoyer un message à partir d’une machine et le recevoir par plusieurs machines.

J’espère que cette réponse sera utile aux autres car ce fut un véritable effort d’essais et d’erreurs pour moi.

J’ai résolu mon problème par un autre moyen:

  1. Créer une queue privée avec une adresse de multidiffusion.
  2. Créer une queue en production par next

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

    MessageQueue mq = new MessageQueue (QUEUE_PATH)

  3. Créez ensuite une queue de consommateurs ( chaque consommateur a un nom différent! ):

consommateur1:

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

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

mq.MulticastAddress = “234.1.1.1:8001”;

consommateur2:

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

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

mq.MulticastAddress = “234.1.1.1:8001”;

Les sources peuvent être trouvées ici: https://github.com/constructor-igor/TechSugar/tree/master/MessageQueue

L’explication des parameters courts peut être trouvée: https://github.com/constructor-igor/TechSugar/wiki/MessageQueue