La technologie Microsoft Message Queuing (MSMQ) permet à des applications exécutées à des moments différents de communiquer à travers des réseaux et des systèmes hétérogènes, même s’ils sont temporairement déconnectés. MSMQ fournit une livraison des messages garantie, un routage efficace, une sécurité et une messagerie basée sur la priorité. Vous pouvez l’utiliser pour implémenter des solutions à la fois pour des scénarios de messagerie asynchrones et synchrones.
Le composant Windows MSMQ n'est pas installé par défaut en général.
Pour l'installer voir ici
Pour utiliser cette technologie dans Windev, voici deux solutions (il y en a peut être d'autres) :
A - en utilisant l'assemblage dotnet "System.Messaging"
B - en utilisant des objets COMs
Ci-après, deux petits exemples d'utilisation qui ne montrent qu'une infime partie de ce que l'on peut faire avec MSMQ. Ici on ne fait qu'envoyer des messages sur la même machine. Mais on peut envoyer d'autres choses que des messages, par exemple des images, des structures, des objets sérialisés. On peut aussi envoyer sur d'autres machines, etc...
A - Avec dotnet
1 - Création de la file et capture de l'évenement de réception :
2 - la procédure de réception :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 QueueLecture est une chaîne=".\Private$\MaFile" pclMyQueue est un objet MessageQueue dynamique SI MessageQueue.Exists(QueueLecture) ALORS // on affecte la File pclMyQueue = new MessageQueue(QueueLecture) SINON // on crée la File pclMyQueue = MessageQueue.Create(QueueLecture) FIN pclMyQueue:add_ReceiveCompleted(DotNetDélégué("ReceptionCommande","ReceiveCompletedEventHandler")) pclMyQueue:BeginReceive()
3 - un envoi de message dans la File :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 PROCEDURE ReceptionCommande(src est un MessageQueue ,args est un ReceiveCompletedEventArgs) lemessage est un System.Messaging.Message dynamique lemessage = src:EndReceive(args.AsyncResult) lemessage.Formatter = new BinaryMessageFormatter() // Affiche les messages reçus dans la File Info("Message: " + " Titre: " + lemessage.label + " Corps:" + lemessage.Body) // Réarme la réception src:BeginReceive()
B - avec des objets COMs
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 QueueEcriture est une chaîne=".\Private$\MaFile" monMessage est un System.Messaging.Message dynamique SI MessageQueue.Exists(QueueEcriture) ALORS pclMyQueue est un objet MessageQueue dynamique=allouer un MessageQueue(QueueEcriture) // Enable the AppSpecific field in the messages. pclMyQueue.MessageReadPropertyFilter.AppSpecific = True // Set the formatter to binary. pclMyQueue.Formatter = new BinaryMessageFormatter() // Create a simple text message. monMessage = allouer un "System.Messaging.Message"("Coucou !!!!", new BinaryMessageFormatter()) monMessage.Label = "Premier Message"; pclMyQueue:Send(monMessage) FIN
1 - Envoi de message :
2 - Réception de messages en asynchrone (par événements)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Queue est un objet automation dynamique MonMsmq est un objet automation "MSMQ.MSMQQueueInfo" // créer l'objet dynamique MonMsmq>>PathName = ".\Private$\MaFileCOM" QUAND EXCEPTION DANS MonMsmq>>Create FAIRE // ceci est une supposition Info(" MaFileCOM existe déja") FIN Queue = MonMsmq>>Open ( 2, 0 ) SI Queue>>isOpen ALORS Lemessage est un objet automation "MSMQ.MSMQMessage" Lemessage>>Body = "coucou" Lemessage>>Label = "titre" Lemessage>>Send(Queue) Queue>>close() FIN
Dans Déclaration de ProcéduresGlobales de votre projet :
la procédure globale TraiteMonMessage :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 TheQueue est un objet Automation dynamique MonMsmq est un objet Automation "MSMQ.MSMQQueueInfo" // créer l'objet dynamique MonMsmqEvent est un objet Automation "MSMQ.MSMQEvent" LeMessage est un objet Automation dynamique MonMsmq>>PathName = ".\Private$\MaFileCOM" QUAND EXCEPTION DANS // on crée la File si elle n'existe pas MonMsmq>>Create FAIRE // ceci est une supposition // Info(" MaFileCOM existe déja") FIN TheQueue = MonMsmq>>Open ( 1, 0 ) SI TheQueue>>isOpen ALORS AutomationEvénement("TraiteMonMessage" ,MonMsmqEvent , "{D7D6E078-DCCD-11D0-AA4B-0060970DEBAE}",0) TheQueue>>EnableNotification(MonMsmqEvent) FIN
Il est à noter qu'une fois qu'on a installé MSMQ sur sa machine, on peut voir toutes les Files et les messages dans la console "Gestion de l'ordinateur" (accessible par clic droit sur Ordinateur et faire gérer). Dans Services et Applications, il y a une nouvelle rubrique qui s'appelle "Message Queuing".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 PROCEDURE TraiteMonMessage(src ,curseur ) LeMessage = src>>ReceiveCurrent() Info("Message : " + LeMessage>>Body) src>>EnableNotification(MonMsmqEvent)
Ami calmant, J.P
Partager