07 September 2010 HowTo, MSMQ Robert Muehsig

image

Erst vor kurzem bin ich auf MSMQ gestoßen. MSMQ ist vereinfach gesagt ein System, in dem Nachrichten in Queues, also Warteschlangen, verarbeitet (angelegt/ausgelesen) werden können.

 

Wofür überhaupt?

MSMQ ist ein Warteschlangen System. Man steckt Nachrichten ein und irgendeiner holt diese ab und verarbeitet diese. Die kann in verteilten Anwendungen z.B. praktisch sein. So kann man z.B. Emails generieren und diese in eine Queue schreiben und Stück für Stück langsam verschicken, damit der Email-Server nicht in die Knie geht. Es gibt bestimmt noch weit, weit mehr Szenarien, aber das soll nur ein Einstieg sein :)

Weiter unten gehe ich noch weiter auf ein paar Vor- und evtl. Nachteile ein. Hier wäre ich auch sehr froh Feedback von euch zu bekommen :)

Voraussetzungen

Die Infrastruktur für MSMQ ist seit XP (?) überall dabei. Man muss es nur in den Windows Funktionen mit aktivieren:

image

Danach ist im Computer-Management und Services der MSMQ Dienst zu sehen:

image

Man kann über das Kontextmenü (Rechtsklick) auch neue Warteschlangen einrichten und in die Warteschlangen auch reinschauen.

image

Dort kann man auch die einzelnen Nachrichten ansehen:

image

Für mein Democode ist es notwendig, dass man unter den Privaten Warteschlangen die "Test” Queue erstellt.

Zum Code

Im .NET Framework gibt es in der System.Messaging Assembly bereits alles, was man zum Starten braucht:

image

Neue Message in die Queue schreiben:

            MessageQueue queue = new MessageQueue(@".\private$\test");
            queue.Send("test");

Message auslesen:

            MessageQueue queue = new MessageQueue(@".\private$\test");
            Console.WriteLine(queue.Receive().Body.ToString());

Easy, oder? Bei "Receive” wird die erste Nachricht aus der Queue genommen. Diese ist dann für andere Clients auch nicht mehr erreichbar.

Komplexe Datentypen

Man kann natürlich auch komplexe Datenstrukturen senden, diese werden dann über den XmlSerializer in die Nachricht geschrieben und ausgelesen.

Hier mein komplettes Beispiel:

using System;
using System.Collections.Generic;
using System.Messaging;
using System.Text;

namespace MSMQ
{
    public class User
    {
        public string Name { get; set; }
        public DateTime Birthday { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Simple Text");
            Console.WriteLine("Input for MSMQ Message:");
            string input = Console.ReadLine();
            
            MessageQueue queue = new MessageQueue(@".\private$\test");

            queue.Send(input);

            Console.WriteLine("Press Enter to continue");
            Console.ReadLine();

            Console.WriteLine("Output for MSMQ Queue");
            Console.WriteLine(queue.Receive().Body.ToString());
            Console.ReadLine();

            Console.WriteLine("Complex Text");

            User tester = new User();
            tester.Birthday = DateTime.Now;
            tester.Name = "Test Name";
            queue.Send(tester);

            Console.WriteLine("Output for MSMQ Queue");
            User output = (User)queue.Receive().Body;
            Console.WriteLine(output.Birthday.ToShortDateString());
            Console.ReadLine();


        }
    }
}

Funktioniert, und weiter? Warum MSMQ benutzen?

Man kann solche Queuing Geschichten natürlich auch durch SQL oder andere Eigenentwicklungen umsetzen. Lohnt sich der Blick auf MSMQ?

Vor- und Nachteile (von diesem Stackoverflow Thread)

Cons:

  • Each queue can only be 2GB.
  • Each message 4MB (altough the 4MB limit can be fixed by using MSMQ with WCF).
  • Only for Windows so you're limited to use it with .NET, C/C++ or COM library for COM-enabled environments.

Pros:

  • Supports Windows Network Load Balancer.
  • Supports Microsoft Cluster Service.
  • Integrated with Active Directory.
  • Ships with Windows.
  • Supports transactions.
  • MSMQ messages can be tracked by audit messages in the Windows Event log.
  • Messages can be automatically authenticated (signed) or encrypted upon sending, and verified and decrypted upon reception.

Frage an euch...

Nutzt ihr MSMQ? Oder doch lieber eine simple SQL Datenbank und flache Tabelle dafür nutzen? Zwar klingen die Pros gut, aber könnte ich dies nicht alles auch mit einer SQL DB bekommen? Gibt es irgendwo komplexere Beispiele, mit Transaktionen etc.?

Wahrscheinlich kann man am Ende nicht direkt sagen, was besser ist. Aber vielleicht hat jemand von euch ein paar gute Zusatzframeworks parat oder sagt irgendwelche No-Gos :)

Links

[ Download Democode ]


Written by Robert Muehsig

Software Developer - from Saxony, Germany - working on primedocs.io. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de