Introduction au MSMQ et ses concepts
Introduction au MSMQ et ses concepts
Version 1.0
Pierre-Franck Chauvet
2 [Le MSMQ] [Date : 10/10/09]
Sommaire
1 Introduction ..................................................................................................................................... 3
2 Le Concept ....................................................................................................................................... 5
2.1 Les messages ........................................................................................................................... 5
2.2 Les files d’attentes ................................................................................................................... 5
2.3 WorkGroup .............................................................................................................................. 7
2.4 Active Directory ....................................................................................................................... 7
3 Utilisation ........................................................................................................................................ 9
3.1 Activer le service ..................................................................................................................... 9
3.2 Dans le code .......................................................................................................................... 12
3.2.1 Création d’une file d’attente privée .............................................................................. 13
3.2.2 Déclaration de la file d’attente ...................................................................................... 13
3.2.3 Création de message ..................................................................................................... 13
3.2.4 Envoi d’un message ....................................................................................................... 14
3.2.5 Réception d’un message ............................................................................................... 15
3.2.6 Répondre à un message ................................................................................................ 16
3.3 Exemple ................................................................................................................................. 16
4 Conclusion ..................................................................................................................................... 24
1 Introduction
Le MSMQ (MicroSoft Message Queuing) est la technologie proposée par Microsoft pour gérer
les files d’attente en programmation interprocessus. Cette technologie est le MOM (Message
Oriented Middleware) par Microsoft ; c’est l’infrastructure qui permet un couplage d’application
grâce à des files d’attente et des messages.
Cette technologie est implantée depuis Windows 95 avec MSMQ v1.0, v2.0 sur Windows 2000,
v3.0 sur Windows X et Serveur 2003, actuellement la v4.0 pour Windows Vista, 7 et Server2008. Les
files d’attente de messages sont des liaisons asynchrones entre plusieurs processus.
Dans ce chapitre, nous allons étudier les files d’attente MSMQ Microsoft et comment interagir
avec dans nos programme .NET. L’utilisation du message queuing est asynchrone : en effet le client
n’attend pas la réponse au message pour continuer sur la suite du programme, ce qui apporte tous
les avantages exposés dans le cours précédant (voir le chapitre sur Le .NET Remoting One-Way et
Asynchrone). Mais le Remoting asynchrone impliquait le fait que le client et le serveur s’exécutent en
même temps. Ici, MSMQ va plus loin car il permet en plus de garder les messages sur le Système
d’exploitation même si le programme n’est pas lancé. Du coup, le Message Queuing peut s’exécuter
dans un environnement déconnecté. Ainsi un programme qui n’aura pas besoin d’une connexion
continue au serveur pourra créer des messages à chaque demande auprès du serveur, et les envoyer
une fois le serveur connecté. De même, si les calculs serveur prennent du temps et que le client se
déconnecte, il sera toujours possible de récupérer les résultats lors de la prochaine connexion.
2 Le Concept
Le concept du MSMQ est l’échange de messages entre plusieurs parties (processus). Pour cela
on rajoute une application tiers (où on l’intègre au client/serveur) qui gérera la communication entre
le client et le serveur. Il existe plusieurs types de messages ainsi que différentes files d’attentes pour
gérer toutes les possibilités.
Paramètre Description
Body Corps du message comprenant les données.
Label Ou étiquette du message qui peut correspondre à l’objet sur un
mail.
ID Permet d’identifier le message.
AdministrationQueue Obtient ou définit la file d’attente d’administration.
DestinationQueue Obtient la file d’attente de destination.
Formater Obtient ou définit le formateur utilisé pour sérialiser et
désérialiser l’objet.
Priority Obtient ou définit la priorité du message.
ReponseQueue Obtient ou définit la file d’attente de réponse du message.
TimeToBeReceived Obtient ou définit le délai d’attente pour la réception du message
à partir de la file d’attente de destination.
TimeToReachQueue Obtient ou définit le délai accordé à un message pour atteindre la
file d’attente.
UseJournal Obtient ou définit si on utilise une file d’attente journal avec copie
des messages.
Le nom de chemin : assez similaire à une adresse de répertoire partagée, il peut être
utilisé le plus souvent pour des files d’attente local (le nom de la machine est donc
remplacé par un simple point)
« NomDeLaMachine\NomDeLaQueuePublique »
Exemple d’une file d’attente privée local
« .\Private$\NomDeLaQueuePrivée »
Le nom de format : à privilégier pour de la programmation, le nom de format existe
sous plusieurs formes. Le plus courant est celui direct qui permet d’accéder à des files
d’attentes aussi bien publiques que privées sans passer par le service Active directory.
« DIRECT=AdresseDeLaMachine\NomDeLaQueuePublique »
Pour spécifier l’adresse de la machine on peut utiliser les techniques suivantes :
OS : Il permet de spécifier le nom de la machine directement
« DIRECT=OS :PFCH5-Laptop\$Private\NomDeLaQueuePrivée »
TCP : Il permet de spécifier l’IP de la machine
« DIRECT=TCP :[Link]\$Private\NomDeLaQueuePrivée »
http : permet de spécifier l’adresse URL.
Remarque : pour le protocole http (et seulement ce protocole) il est possible
d’utiliser des slashes ou des antislashes.
« DIRECT=[Link] »
« DIRECT=[Link] »
Il existe aussi le format public qui permet de référencer une file d’attente publique en
utilisant le routage interne à MSMQ : « PUBLIC= GUIDDeLaQueuePublique »
Le format privé dont le fonctionnement est assez similaire sauf qu’ici il faut spécifier le
GUID de la machine et non de la queue (les queues privée n’utilisant pas l’Active
Directory)
« PRIVATE=GUIDDeLaMachine\NomDeLaQueue »
Enfin il est possible d’utiliser plusieurs files d’attente à l’aide d’une virgule
« DIRECT=OS :PFCH5-
Laptop\NomDeLaQueuePublique,DIRECT =TCP :[Link]\Private$\ NomDeLaQueue
Privée »
2.3 WorkGroup
L’utilisation de MSMQ peut se faire selon 3 modes distincts :
Chacun de ces modes présente des particularités et restrictions propres. Nos ordinateurs utiliseront
la plupart du temps le mode WorkGroup ce qui implique donc les contraintes suivantes :
Une liaison directe entre l’expéditeur et le destinataire (due à une impossibilité d’utiliser les
serveurs de routage).
les files d’attente privées ne sont créées et gérées qu’en local et les files d’attente publique
sont impossibles d’accès (il est néanmoins possible d’accéder à une file d’attente privée avec
une liaison directe : voir première contrainte).
obligation d’utiliser des certificats externes pour l’envoi de message avec authentification
l’encryption des messages est impossible
ainsi que l’envoi des messages vers une file d’attente étrangère (n’utilisant pas le MSMQ) ou
vers des connecteurs.
Mis en place avec Windows Server 2000, il équipe depuis Windows 2003 et 2008. Il comprend les
domaines classés selon une arborescence :
La Forêt représente l’ensemble de tous les sous domaines Active Directory (et regroupe les
Arbres).
L’Arbre représente l’ensemble des conteneurs et feuilles de l’Active Directory.
Domaine représente un conteneur ou une feuille.
Dans un environnement de domaine, des objets Message Queuing sont créés dans l’Active Directory,
pour tous types d’ordinateurs utilisant Message Queuing (sauf un client dépendant). Ces objets
contiennent des informations Message Queuing.
3 Utilisation
Remarque : il est possible de dérouler le menu est de trouver des fonctionnalités supplémentaires
qui ne seront pas utilisées dans ce cours.
Une fois ce service coché, on peut le retrouver dans le panneau « gestion de l’ordinateur »
(accessible depuis le menu démarrer avec un clic droit sur « Ordinateur » puis « Gérer » , ou en
tapant « MMC » dans le champs de recherche, puis fichier, ouvrir « [Link] ».
D’ici, il vous sera possible de gérer les file d’attentes à votre convenance, les créer ou voir les
contenus, ainsi que de leur associer des triggers (déclencheurs).
//C#
using [Link];
‘[Link]
Imports [Link]
On trouve ensuite dans cette bibliothèque beaucoup de méthodes telles que les suivantes :
//C#
if ()
{
[Link](@".\Private$\MaFilePrivee");
}
‘[Link]
If Not [Link](".\Private$\MaFilePrivee") Then
[Link](".\Private$\MaFillePrivee")
End If
Remarque : Ici la file créée est privée pour la création d’une file d’attente publique il suffira
simplement d’enlever le « Private$ » et donc « .\MaFilePublique ».
//C#
MessageQ1 = new MessageQueue(@".\Private$\MaFilePrivee");
‘[Link]
MessageQ1 = New MessageQueue(".\Private$\MaFilePrivee")
//C#
[Link] msg = new [Link]();
[Link] = "Corps de mon message";
[Link] = "Entete de mon message";
[Link] = new MessageQueue(@".\private$\MaFileReponse");
‘[Link]
Dim msg As New [Link]()
[Link] = "Corps de mon message"
[Link] = "Entete de mon message"
[Link] = New MessageQueue(".\private$\MaFileReponse")
Ici notre message « msgsend » a un string comme corps, « Entete de mon message » comme Label et
comme reponseQueue, la file d’attente privée « reponseq »
Remarque : dès cet exemple, j’utilise l’Espace de nom complet, car il existe d’autres classes message
qui pourraient dérouter l’ordinateur lors de la compilation (c’est notamment le cas en Windows
Form).
Remarque : le label, mentionné ici est un Label visible dans la console Management Microsoft
dans l’onglet MessageQueuing, le Label du message lui correspond à une propriété du message qui
peut être récupéré.
//C#
[Link] msgout = new [Link]();
[Link] = "Wahouuu";
[Link] = "Mon Premier Message";
[Link](msgout);
‘[Link]
Dim msgout As New [Link]()
[Link] = "Wahouuu"
[Link] = "Mon Premier Message"
[Link](msgout)
//C#
[Link] msgin = new [Link]();
msgin = [Link]();
‘[Link]
Dim msgin As New [Link]()
msgin = [Link]()
On peut donc récupérer les informations telles que le corps ou le Label et les afficher dans
notre programme.
Cette méthode qui est la plus simple et rapide, comporte néanmoins quelques failles. En
effet, s’il n’existe pas de message dans la file, le programme va se bloquer dans l’attente d’un
message. Il provoquera tel un appel de service synchrone, un ralentissement voire une fenêtre
« votre programme a cessé de fonctionner ».Pour cela, il existe plusieurs types de méthode
Receive() :
Comme vu dans le chapitre précédent, il existe une autre solution, que l’on trouve dans
l’asynchrone ; pour cela MSMQ a directement les outils nécessaires, avec la présence de
BeginReceive et EndReceive.
L’utilisation de ces deux méthodes est en tout point similaire à BeginInvoke et EndInvoke.
Là encore on utilise le using « [Link] » et l’on crée un objet IAsyncResult
//C#
IAsyncResult iarR = [Link]();
//code exécuter durant la réception du message.
[Link] msgin = [Link](iarR);
‘[Link]
Dim iarR As IAsyncResult = [Link]()
'code exécuter durant la réception du message.
Dim msgin As [Link] = [Link](iarR)
//C#
[Link] msg = new [Link]();
[Link] = new MessageQueue(@".\private$\MaFileReponse");
‘[Link]
Dim msg As New [Link]()
[Link] = New MessageQueue(".\private$\MaFileReponse")
Le serveur peut travailler sur le message puis le renvoyer au client sur la file d’attente indiquée
par le client, grâce à la méthode suivante qui remplace la méthode Send().
//C#
[Link](msgout);
‘[Link]
[Link](msgout)
Ainsi on pourra récupérer des messages réponse dans la file d’attente privée
« MaFileReponse ».
3.3 Exemple
Pour notre exemple, nous allons utiliser deux ordinateurs sur un même réseau LAN. Notre
programme est conçu en Winform. L’interface utilisateur Winform propose une ListBox pour
l’affichage des résultats, et une TextBox pour créer de nouveaux messages. Le nouveau message
contiendra un nom ou pseudo et sera envoyé par message queuing à un serveur qui rajoutera
« hello » et répondra sur la file réponse prédéfini dans le message.
//C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace testmsqn
{
public partial class Form1 : Form
{
private MessageQueue MessageQ1;
private MessageQueue MessageQ2;
public Form1()
{
InitializeComponent();
if ()
{
[Link](@".\Private$\reponseq");
}
MessageQ1 = new MessageQueue(@".\Private$\reponseq");
MessageQ2 = new
MessageQueue(@"FormatName:DIRECT=TCP:[Link]\myqueue");
[Link]();
}
IAsyncResult iarR =
[Link]([Link](500));
[Link] msg =
[Link](iarR);
[Link]([Link]);
}
catch
{
[Link]("Temps d'attente dépassé");
}
}
‘[Link]
Imports System
Imports [Link]
Imports [Link]
Imports [Link]
Imports [Link]
Imports [Link]
Imports [Link]
Imports [Link]
Namespace testmsqn
Partial Public Class Form1
Inherits Form
Private MessageQ1 As MessageQueue
Private MessageQ2 As MessageQueue
Notre serveur est lui un programme console qui rajoutera à la chaine de départ « hello » et « !!! » :
//C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
namespace testmsmqS
{
class Program
{
static void Main(string[] args)
{
[Link]("GO Serveur");
if ()
{
[Link](@".\Private$\myqueue");
}
while (true)
{
[Link](500);
[Link] = new XmlMessageFormatter(new String[]
{ "[Link]" });
try
{
IAsyncResult iarR =
[Link]([Link](500));
[Link] msgin =
[Link](iarR);
[Link] = Helloman([Link]());
[Link]([Link]());
[Link](msgin);
}
catch { }
}
}
Imports System
Imports [Link]
Imports [Link]
Imports [Link]
Imports [Link]
Imports [Link]
Namespace testmsmqS
Class Program
Private Shared Sub Main(ByVal args As String())
[Link]("GO Serveur")
While True
[Link](500)
[Link] = New XmlMessageFormatter(New
[String]() {"[Link]"})
Try
Dim iarR As IAsyncResult =
[Link]([Link](500))
Dim msgin As [Link] =
[Link](iarR)
[Link] = Helloman([Link]())
[Link]([Link]())
[Link](msgin)
Catch
End Try
End While
End Sub
End Namespace
On clique sur le bouton recevoir mais la file d’attente ne contient aucun message ou on
envoie un message au serveur, qui lui n’est pas lancé, puis on fait recevoir : dans ce cas la
ListBox affiche « Délai d’attente dépassé »
Si au contraire on envoie un message à un serveur lancé, et que celui-ci répond, un clic sur
recevoir permet de l’afficher.
4 Conclusion
Dans ce chapitre, nous avons vu comment utiliser le MSMQ, le message Queuing proposé par
Microsoft.
Nous avons parcouru les différents types de message et de file d’attente et, à l’aide d’un
exemple final, montré comment en tirer profit.