MS Message Queuing avec Windev
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 :
Code:
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() |
2 - la procédure de réception :
Code:
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() |
3 - un envoi de message dans la File :
Code:
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 |
B - avec des objets COMs
1 - Envoi de message :
Code:
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 |
2 - Réception de messages en asynchrone (par événements)
Dans Déclaration de ProcéduresGlobales de votre projet :
Code:
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 |
la procédure globale TraiteMonMessage :
Code:
1 2 3 4
| PROCEDURE TraiteMonMessage(src ,curseur )
LeMessage = src>>ReceiveCurrent()
Info("Message : " + LeMessage>>Body)
src>>EnableNotification(MonMsmqEvent) |
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".
Ami calmant, J.P ;)