27 votes

Écriture vers une file d'attente MSMQ distante

D'accord, voici une question très simple et fondamentale. Si j'ai une application sur la machine Windows A qui souhaite écrire dans une file d'attente sur la machine Windows B, est-ce que j'ai besoin d'avoir MSMQ installé sur la machine A (même s'il n'y a pas de file d'attente là-bas) ? Je viens tout juste de commencer à utiliser des files d'attente pour mes applications et j'essaie de comprendre certains fondamentaux.

Merci

50voto

stuartd Points 22668

Oui, vous avez besoin de MSMQ installé localement pour écrire dans une file d'attente distante. Si vous écrivez dans une file d'attente privée, consultez cette page qui contient des informations utiles sur comment formater le nom de la file d'attente. Si vous écrivez dans une file d'attente transactionnelle distante, alors vous devez vous assurer de spécifier correctement cela (point 5)

Voici le texte de l'article:

1. Lorsque vous travaillez avec des files d'attente distantes, le nom de la file d'attente au format nommachine\private$\nomfile ne fonctionne pas. Cela entraîne une erreur de "chemin de file d'attente invalide".

2. Le nom de la file d'attente doit être mentionné comme FormatName:Direct=OS:nommachine\\private$\\nomfile.

Ceci est nécessaire car l'accès à la file d'attente se fait en interne en utilisant uniquement la syntaxe du nom de format. L'autre représentation conviviale est convertie en FormatName puis utilisée. Lorsque vous travaillez avec des files d'attente distantes, à moins qu'il n'y ait un AD pour résoudre le nom de la file d'attente, le nom convivial ne fonctionnera pas. Consultez la documentation pour plus de détails.

Par exemple.

MessageQueue rmQ = new MessageQueue 
              ("FormatName:Direct=OS:nommachine\\private$\\file");
rmQ.Send("envoyé à la file d'attente régulière - Atul");

3. En plus du point précédent, notez que FormatName est sensible à la casse. Si vous mentionnez la chaîne précédente comme FORMATNAME:Direct=OS:nommachine\\private$\\nomfile, cela ne fonctionnera pas. Étonnamment, aucune erreur n'est lancée dans ce cas. La partie "FormatName" de la chaîne semble être la seule sensible à la casse. Les autres parties peuvent apparaître dans une casse différente. Par exemple. Vous pouvez écrire "DIRECT".

4. Au cas où vous voudriez utiliser l'adresse IP de la machine, la syntaxe sera FormatName:Direct=TCP:adresseIP\\private$\\nomfile.

Par exemple.

MessageQueue rmQ = new MessageQueue
              ("FormatName:Direct=TCP:121.0.0.1\\private$\\file");
rmQ.Send("envoyé à la file d'attente régulière - Atul");

5. Les propriétés transactionnelles de l'instance de file d'attente que vous créez dans le code doivent correspondre à celles de la file d'attente à laquelle vous essayez d'envoyer le message. Ainsi, dans les exemples précédents, j'envoyais le message à une file d'attente non transactionnelle. Pour envoyer à une file d'attente transactionnelle, le code serait

MessageQueue rmTxnQ = new MessageQueue
            ("FormatName:Direct=OS:nommachine\\private$\\file");
rmTxnQ.Send("envoyé à la file Txn - Atul", MessageQueueTransactionType.Single);

Si les propriétés transactionnelles ne correspondent pas, le message ne sera pas livré. La partie étonnante est encore une fois, je n'ai reçu aucune erreur, et le message a simplement disparu

6. Enfin, lorsque vous envoyez des messages à une file d'attente distante, une file d'attente sortante temporaire est créée sur votre propre machine. Cela est utilisé au cas où la file d'attente distante ne serait pas disponible. Si vous allez dans la console de gestion de l'ordinateur (compmgmt.msc), et développez les Services et Applications / File d'attente de message / Files d'attente sortantes, vous verrez ces files d'attente. Le côté droit de la console devrait afficher les détails incluant l'état (connecté ou non) et les adresses IP pour les prochains sauts.

8voto

John Breakwell Points 3247

Toute communication MSMQ nécessite un gestionnaire de file d'attente MSMQ à chaque extrémité. Les applications utilisant MSMQ communiquent avec leur gestionnaire de file d'attente local qui effectue le travail pour elles. Les applications utilisant MSMQ ne peuvent pas communiquer directement avec des files d'attente, locales ou distantes.

3voto

Rendition Points 199

Une autre solution (au lieu d'installer MSMQ sur la machine locale exécutant le client) serait de mettre en œuvre un service WCF qui récupère ses messages à partir d'une file d'attente MSMQ. Dans ce cas, votre client distant aurait seulement besoin de spécifier le point de terminaison du service distant pour écrire directement dans la file d'attente distante. Vous devriez également vous assurer que la sécurité de la file d'attente distante est correctement configurée.

Je pense que ce serait une meilleure façon de mettre en œuvre une communication basée sur les files d'attente. C'est une réponse courte, mais je serai heureux de développer si vous êtes intéressé (j'ai remarqué que vous étiez assez satisfait de l'autre réponse :)

0voto

abksharma Points 126

Le format ci-dessous a fonctionné pour nous

clé="NomDeQueuePublic" valeur="NomDeFormat:Direct=TCP:192.168.12.58\private$\myqueue"

De plus, vous devrez accorder des autorisations d'accès à la file d'attente distante

sécurité : Autoriser la connexion Anonyme

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X