Programování

Jak pracovat s MSMQ v C #

MSMQ (Microsoft Message Queuing) je fronta zpráv, která je ve výchozím nastavení k dispozici jako součást systému Windows. Spolehlivý způsob odesílání a přijímání zpráv napříč počítačovými systémy poskytuje MSMQ frontu, která je škálovatelná, bezpečná pro vlákna, jednoduchá a pohodlná k použití a zároveň vám poskytuje příležitost přetrvávat zprávy v databázi Windows. MSDN uvádí: "Technologie Message Queuing (MSMQ) umožňuje aplikacím spuštěným v různých časech komunikovat v heterogenních sítích a systémech, které mohou být dočasně offline. Aplikace odesílají zprávy do front a čtou zprávy z front."

Při práci s MSMQ máte obvykle dvě odlišné aplikace - odesílatele a příjemce. Když jsou zprávy odesílány odesílatelem, tj. Odesílající aplikací, nemusí být přijímající aplikace ve stavu provádění - zprávy jsou ve skutečnosti uloženy ve frontě udržované hostitelským operačním systémem a tyto jsou zařazeny do fronty tak, jak a kdy jsou potřebné přijímající aplikací.

Vytvoření fronty

MSMQ ve svém systému můžete zapnout pomocí možnosti „Zapnout nebo vypnout funkce systému Windows“ na ovládacím panelu. Po instalaci MSMQ do vašeho systému je vytvoření fronty jednoduché. Stačí přejít na „Tento počítač“, kliknout pravým tlačítkem a vybrat Spravovat. V okně „Správa počítače“ můžete z uzlu „Řízení front zpráv“ vytvořit novou frontu. Frontu můžete také vytvořit programově.

Programování MSMQ v C #

Chcete-li pracovat s MSMQ, budete muset zahrnout jmenný prostor System.Messaging. Chcete-li programově vytvořit frontu, musíte využít metodu Create třídy MessageQueue. Následující fragment kódu to ilustruje.

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

Chcete-li vytvořit frontu a odeslat do ní zprávu, můžete použít následující fragment kódu.

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

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

messageQueue.Label = "Toto je testovací fronta.";

messageQueue.Send ("Toto je testovací zpráva.", "");

Předpokládejme, že byste chtěli zkontrolovat, zda fronta existuje, a pokud ano, pošlete jí zprávu. Pokud fronta neexistuje, můžete vytvořit novou a odeslat jí zprávu. Přesně to pro vás dělá následující výpis kódu.

static void Main (řetězec [] args)

        {

MessageQueue messageQueue = null;

string description = "Toto je testovací fronta.";

string message = "Toto je testovací zpráva.";

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

Snaž se

            {

if (MessageQueue.Exists (cesta))

                {

messageQueue = nová MessageQueue (cesta);

messageQueue.Label = popis;

                }

jiný

                {

MessageQueue.Create (cesta);

messageQueue = nová MessageQueue (cesta);

messageQueue.Label = popis;

                }

messageQueue.Send (zpráva);

            }

chytit

            {

házet;

            }

Konečně

{

messageQueue.Dispose ();

}

      }

Následující výpis kódu ukazuje, jak můžete zpracovat zprávy uložené ve frontě zpráv pomocí C #.

soukromý statický seznam ReadQueue (cesta řetězce)

        {

List lstMessages = new List ();

pomocí (MessageQueue messageQueue = nová MessageQueue (cesta))

            {

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

foreach (zpráva System.Messaging.Message ve zprávách)

                {

message.Formatter = nový XmlMessageFormatter (

nový řetězec [] {"System.String, mscorlib"});

string msg = message.Body.ToString ();

lstMessages.Add (zpráva);

                }

            }

vrátit lstMessages;

        }

Dále můžete vyvolat metodu ReadQueue a načíst zprávy uložené ve frontě zpráv, jak je znázorněno v fragmentu kódu níže.

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

Seznam lstMessages = ReadQueue (cesta);

Můžete také ukládat objekty do fronty zpráv. Jako příklad předpokládejme, že musíte do fronty uložit zprávu protokolu. Zpráva protokolu je uložena v instanci třídy LogMessage třídy, která obsahuje nezbytné vlastnosti, které se vztahují k podrobnostem zprávy protokolu. Takto by vypadala třída LogMessage - zjednodušil jsem to pouze se dvěma vlastnostmi.

veřejná třída LogMessage

    {

veřejný řetězec MessageText {get; soubor; }

public DateTime MessageTime {get; soubor; }

    }

Měli byste upravit třídu LogMessage tak, aby zahrnovala další nezbytné vlastnosti, tj. Závažnost zprávy atd. Následující metoda ukazuje, jak můžete uložit instanci třídy LogMessage do fronty zpráv.

private static void SendMessage (string queueName, LogMessage msg)

        {

MessageQueue messageQueue = null;

if (! MessageQueue.Exists (queueName))

messageQueue = MessageQueue.Create (název fronty);

jiný

messageQueue = nová MessageQueue (queueName);

Snaž se

            {

messageQueue.Formatter = nový XmlMessageFormatter (nový typ [] {typeof (LogMessage)});

messageQueue.Send (msg);

            }

chytit

            {

// Sem napište kód a proveďte potřebné zpracování chyb.

            }

Konečně

            {

messageQueue.Close ();

            }          

        }

Následující fragment kódu ukazuje, jak můžete vytvořit instanci třídy LogMessage třídy, naplnit ji daty a poté vyvolat SendMessage metodu pro uložení instance vytvořené ve frontě zpráv.

LogMessage msg = new LogMessage ()

            {

MessageText = "Toto je testovací zpráva.",

MessageTime = DateTime.Now

            };

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

Následující výpis kódu ukazuje, jak si můžete přečíst instanci LogMessage uloženou ve frontě zpráv.

soukromá statická LogMessage ReceiveMessage (řetězec queueName)

        {

if (! MessageQueue.Exists (queueName))

vrátit null;

MessageQueue messageQueue = nová MessageQueue (queueName);

LogMessage logMessage = null;

Snaž se

            {

messageQueue.Formatter = nový XmlMessageFormatter (nový typ [] {typeof (LogMessage)});

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

            }

chytit { }

Konečně

            {

messageQueue.Close ();

            }

vrátit logMessage;

        }