Comment travailler avec MSMQ en C #

MSMQ (Microsoft Message Queuing) est une file d'attente de messages qui est disponible par défaut dans le cadre de Windows. Un moyen fiable d'envoyer et de recevoir des messages sur des systèmes informatiques, MSMQ fournit une file d'attente qui est évolutive, thread-safe, simple et pratique à utiliser tout en vous offrant la possibilité de conserver les messages dans la base de données Windows. Le MSDN déclare: «La technologie Message Queuing (MSMQ) permet aux applications exécutées à des moments différents de communiquer sur des réseaux hétérogènes et des systèmes qui peuvent être temporairement hors ligne. Les applications envoient des messages aux files d'attente et lisent les messages des files d'attente.

En règle générale, vous avez deux applications distinctes lorsque vous travaillez avec MSMQ: l'expéditeur et le destinataire. Lorsque les messages sont envoyés par l'expéditeur, c'est-à-dire l'application émettrice, l'application réceptrice n'a pas besoin d'être en état d'exécution - les messages sont en fait stockés dans une file d'attente maintenue par le système d'exploitation hôte et ceux-ci sont retirés de la file au fur et à mesure qu'ils sont nécessaires à l'application destinataire.

Créer une file d'attente

Vous pouvez activer MSMQ sur votre système via l'option «Activer ou désactiver les fonctionnalités Windows» du panneau de configuration. Une fois MSMQ installé sur votre système, la création d'une file d'attente est simple. Allez simplement dans "Poste de travail", faites un clic droit et sélectionnez Gérer. Dans la fenêtre "Gestion de l'ordinateur", vous pouvez créer une nouvelle file d'attente à partir du nœud "Message Queuing". Vous pouvez également créer une file d'attente par programme.

Programmation MSMQ en C #

Pour travailler avec MSMQ, vous devez inclure l'espace de noms System.Messaging. Pour créer une file d'attente par programme, vous devez tirer parti de la méthode Create de la classe MessageQueue. L'extrait de code suivant illustre cela.

MessageQueue.Create(@".\Private$\");

Pour créer une file d'attente et lui envoyer un message, vous pouvez utiliser l'extrait de code suivant.

MessageQueue.Create(@".\Private$\");              

messageQueue = new MessageQueue(@".\Private$\");

messageQueue.Label = "This is a test queue.";

messageQueue.Send("This is a test message.", "");

Maintenant, supposons que vous souhaitiez vérifier si la file d'attente existe et si c'est le cas, envoyez-lui un message. Si la file d'attente n'existe pas, vous souhaiterez peut-être en créer une nouvelle et lui envoyer un message. C'est exactement ce que la liste de codes suivante fait pour vous.

static void Main(string[] args)

        {

            MessageQueue messageQueue = null;

            string description = "This is a test queue.";

            string message = "This is a test message.";

            string path = @".\Private$\";

            try

            {

                if (MessageQueue.Exists(path))

                {

                    messageQueue = new MessageQueue(path);

                    messageQueue.Label = description;

                }

                else

                {

                    MessageQueue.Create(path);

                    messageQueue = new MessageQueue(path);

                    messageQueue.Label = description;

                }

                messageQueue.Send(message);

            }

            catch

            {

                throw;

            }

finally

{

           messageQueue.Dispose();

}

      }

La liste de codes suivante illustre comment vous pouvez traiter les messages stockés dans une file d'attente de messages à l'aide de C #.

private static List ReadQueue(string path)

        {

            List lstMessages = new List();

            using (MessageQueue messageQueue = new MessageQueue(path))

            {

                System.Messaging.Message[] messages = messageQueue.GetAllMessages();

                foreach (System.Messaging.Message message in messages)

                {

                    message.Formatter = new XmlMessageFormatter(

                    new String[] { "System.String, mscorlib" });

                    string msg = message.Body.ToString();

                    lstMessages.Add(msg);

                }

            }

            return lstMessages;

        }

Ensuite, vous pouvez appeler la méthode ReadQueue pour récupérer les messages stockés dans la file d'attente de messages, comme indiqué dans l'extrait de code ci-dessous.

string path = @".\Private$\";

List lstMessages = ReadQueue(path);

Vous pouvez également stocker des objets dans la file d'attente de messages. À titre d'exemple, supposons que vous deviez stocker un message de journal dans la file d'attente. Le message de journal est stocké dans une instance de la classe LogMessage qui contient les propriétés nécessaires relatives aux détails du message de journal. Voici à quoi ressemblerait la classe LogMessage - je l'ai simplifiée avec seulement deux propriétés.

public class LogMessage

    {

        public string MessageText { get; set; }

        public DateTime MessageTime { get; set; }

    }

Vous devez modifier la classe LogMessage pour incorporer d'autres propriétés nécessaires, par exemple, la gravité des messages, etc. La méthode suivante illustre comment vous pouvez stocker une instance de la classe LogMessage dans la file d'attente de messages.

private static void SendMessage(string queueName, LogMessage msg)

        {

            MessageQueue messageQueue = null;

            if (!MessageQueue.Exists(queueName))

                messageQueue = MessageQueue.Create(queueName);

            else

                messageQueue = new MessageQueue(queueName);          

            try

            {

                messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(LogMessage) });

                messageQueue.Send(msg);

            }

            catch

            {

                //Write code here to do the necessary error handling.

            }

            finally

            {

                messageQueue.Close();

            }          

        }

L'extrait de code suivant illustre comment créer une instance de la classe LogMessage, la remplir avec des données, puis appeler la méthode SendMessage pour stocker l'instance créée dans la file d'attente de messages.

LogMessage msg = new LogMessage()

            {

                MessageText = "This is a test message.",

                MessageTime = DateTime.Now

            };

SendMessage(@".\Private$\Log", msg);

La liste de codes suivante illustre comment vous pouvez lire l'instance LogMessage stockée dans la file d'attente de messages.

private static LogMessage ReceiveMessage(string queueName)

        {

            if (!MessageQueue.Exists(queueName))

                return null;

            MessageQueue messageQueue = new MessageQueue(queueName);

            LogMessage logMessage = null;

            try

            {

                messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(LogMessage) });

                logMessage = (LogMessage)messageQueue.Receive().Body;

            }

            catch { }

            finally

            {

                messageQueue.Close();

            }

            return logMessage;

        }