So arbeiten Sie mit MSMQ in C #

MSMQ (Microsoft Message Queuing) ist eine Nachrichtenwarteschlange, die standardmäßig als Teil von Windows verfügbar ist. MSMQ ist eine zuverlässige Methode zum Senden und Empfangen von Nachrichten über Computersysteme hinweg und bietet eine Warteschlange, die skalierbar, threadsicher, einfach und bequem zu verwenden ist und gleichzeitig die Möglichkeit bietet, die Nachrichten in der Windows-Datenbank beizubehalten. Im MSDN heißt es: "Mit der MSMQ-Technologie (Message Queuing) können Anwendungen, die zu unterschiedlichen Zeiten ausgeführt werden, über heterogene Netzwerke und Systeme kommunizieren, die möglicherweise vorübergehend offline sind. Anwendungen senden Nachrichten an Warteschlangen und lesen Nachrichten aus Warteschlangen."

In der Regel haben Sie bei der Arbeit mit MSMQ zwei unterschiedliche Anwendungen - den Sender und den Empfänger. Wenn die Nachrichten vom Absender gesendet werden, dh von der sendenden Anwendung, muss sich die empfangende Anwendung nicht im Ausführungsstatus befinden. Die Nachrichten werden tatsächlich in einer Warteschlange gespeichert, die vom Host-Betriebssystem verwaltet wird, und diese werden nach und nach aus der Warteschlange entfernt werden von der empfangenden Anwendung benötigt.

Erstellen einer Warteschlange

Sie können MSMQ in Ihrem System über die Option "Windows-Funktionen aktivieren oder deaktivieren" in der Systemsteuerung aktivieren. Sobald MSMQ auf Ihrem System installiert wurde, ist das Erstellen einer Warteschlange einfach. Gehen Sie einfach zu "Arbeitsplatz", klicken Sie mit der rechten Maustaste und wählen Sie Verwalten. Im Fenster "Computerverwaltung" können Sie eine neue Warteschlange aus dem Knoten "Nachrichtenwarteschlange" erstellen. Sie können eine Warteschlange auch programmgesteuert erstellen.

Programmieren von MSMQ in C #

Um mit MSMQ arbeiten zu können, müssen Sie den System.Messaging-Namespace einschließen. Um eine Warteschlange programmgesteuert zu erstellen, müssen Sie die Create-Methode der MessageQueue-Klasse nutzen. Das folgende Codefragment veranschaulicht dies.

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

Um eine Warteschlange zu erstellen und eine Nachricht an diese zu senden, können Sie das folgende Codefragment verwenden.

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

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

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

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

Angenommen, Sie möchten überprüfen, ob die Warteschlange vorhanden ist, und eine Nachricht an diese senden. Wenn die Warteschlange nicht vorhanden ist, können Sie eine neue erstellen und anschließend eine Nachricht senden. Dies ist genau das, was die folgende Codeliste für Sie tut.

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();

}

      }

Die folgende Codeliste zeigt, wie Sie die in einer Nachrichtenwarteschlange gespeicherten Nachrichten mit C # verarbeiten können.

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;

        }

Als Nächstes können Sie die ReadQueue-Methode aufrufen, um die in der Nachrichtenwarteschlange gespeicherten Nachrichten abzurufen, wie im folgenden Codeausschnitt gezeigt.

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

List lstMessages = ReadQueue(path);

Sie können Objekte auch in der Nachrichtenwarteschlange speichern. Angenommen, Sie müssen eine Protokollnachricht in der Warteschlange speichern. Die Protokollnachricht wird in einer Instanz der LogMessage-Klasse gespeichert, die die erforderlichen Eigenschaften enthält, die sich auf die Details der Protokollnachricht beziehen. So würde die LogMessage-Klasse aussehen: Ich habe es mit nur zwei Eigenschaften einfach gemacht.

public class LogMessage

    {

        public string MessageText { get; set; }

        public DateTime MessageTime { get; set; }

    }

Sie sollten die LogMessage-Klasse so ändern, dass sie andere erforderliche Eigenschaften enthält, z. B. den Schweregrad der Nachricht usw. Die folgende Methode zeigt, wie Sie eine Instanz der LogMessage-Klasse in der Nachrichtenwarteschlange speichern können.

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();

            }          

        }

Das folgende Codefragment zeigt, wie Sie eine Instanz der LogMessage-Klasse erstellen, mit Daten füllen und dann die SendMessage-Methode aufrufen können, um die in der Nachrichtenwarteschlange erstellte Instanz zu speichern.

LogMessage msg = new LogMessage()

            {

                MessageText = "This is a test message.",

                MessageTime = DateTime.Now

            };

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

Die folgende Codeliste zeigt, wie Sie die in der Nachrichtenwarteschlange gespeicherte LogMessage-Instanz lesen können.

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;

        }