Programmering

Sådan arbejder du med MSMQ i C #

MSMQ (Microsoft Message Queuing) er en meddelelseskø, der som standard er tilgængelig som en del af Windows. En pålidelig måde at sende og modtage meddelelser på tværs af computersystemer giver MSMQ en kø, der er skalerbar, trådsikker, enkel og praktisk at bruge, samtidig med at du giver dig mulighed for at fastholde beskederne i Windows-databasen. MSDN siger: "Message Queuing (MSMQ) -teknologi gør det muligt for applikationer, der kører på forskellige tidspunkter, at kommunikere på tværs af heterogene netværk og systemer, der muligvis er midlertidigt offline. Applikationer sender beskeder til køer og læser beskeder fra køer."

Typisk har du to forskellige applikationer, når du arbejder med MSMQ - afsenderen og modtageren. Når beskederne sendes af afsenderen, dvs. afsendelsesapplikationen, behøver den modtagende applikation ikke være i eksekveringstilstand - meddelelserne gemmes faktisk i en kø, der opretholdes af værtsoperativsystemet, og disse afkøles, når og når de er nødvendige af den modtagende ansøgning.

Oprettelse af en kø

Du kan aktivere MSMQ i dit system via "Slå Windows-funktioner til eller fra" fra kontrolpanelet. Når MSMQ er installeret i dit system, er det enkelt at oprette en kø. Gå bare til "Denne computer", højreklik og vælg Administrer. I vinduet "Computerstyring" kan du oprette en ny kø fra "Beskedkø" -knudepunktet. Du kan også oprette en kø programmatisk.

Programmering af MSMQ i C #

For at arbejde med MSMQ skal du medtage navneområdet System.Messaging. For at oprette en kø programmatisk skal du udnytte metoden Opret i MessageQueue-klassen. Følgende kodestykke illustrerer dette.

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

For at oprette en kø og sende en besked til den kan du bruge følgende kodestykke.

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

messageQueue = ny MessageQueue (@ ". \ Privat $ \");

messageQueue.Label = "Dette er en testkø.";

messageQueue.Send ("Dette er en testmeddelelse.", "");

Antag nu, at du gerne vil kontrollere, om køen findes, og hvis den gør det, send en besked til den. Hvis køen ikke findes, kan du oprette en ny og derefter sende den en besked. Dette er præcis, hvad følgende kodeliste gør for dig.

statisk ugyldigt Main (streng [] args)

        {

MessageQueue messageQueue = null;

string description = "Dette er en testkø.";

string message = "Dette er en testmeddelelse.";

streng sti = @ ". \ Privat $ \";

prøve

            {

hvis (MessageQueue.Exists (sti))

                {

messageQueue = ny MessageQueue (sti);

messageQueue.Label = beskrivelse;

                }

andet

                {

MessageQueue.Create (sti);

messageQueue = ny MessageQueue (sti);

messageQueue.Label = beskrivelse;

                }

messageQueue.Send (besked);

            }

fangst

            {

kaste;

            }

langt om længe

{

messageQueue.Dispose ();

}

      }

Følgende kodeliste illustrerer, hvordan du kan behandle de meddelelser, der er gemt i en meddelelseskø ved hjælp af C #.

privat statisk liste ReadQueue (strengsti)

        {

Liste lstMessages = ny liste ();

ved hjælp af (MessageQueue messageQueue = ny MessageQueue (sti))

            {

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

foreach (System.Messaging.Message besked i beskeder)

                {

message.Formatter = ny XmlMessageFormatter (

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

string msg = message.Body.ToString ();

lstMessages.Add (msg);

                }

            }

returnere lstMeddelelser;

        }

Dernæst kan du påberåbe sig ReadQueue-metoden for at hente de meddelelser, der er gemt i meddelelseskøen som vist i kodestykket nedenfor.

streng sti = @ ". \ Privat $ \";

Liste lstMessages = ReadQueue (sti);

Du kan også gemme objekter i meddelelseskøen. Antag som eksempel, at du skal gemme en logmeddelelse i køen. Logbeskeden gemmes i en forekomst af LogMessage-klassen, der indeholder de nødvendige egenskaber, der vedrører detaljerne i logmeddelelsen. Sådan ser LogMessage-klassen ud - jeg har gjort det enkelt med kun to egenskaber.

offentlig klasse LogMessage

    {

public string MessageText {get; sæt; }

offentlig DateTime MessageTime {get; sæt; }

    }

Du bør ændre LogMessage-klassen for at inkorporere andre nødvendige egenskaber, dvs. beskedets sværhedsgrad osv. Følgende metode illustrerer, hvordan du kan gemme en forekomst af LogMessage-klassen i meddelelseskøen.

privat statisk ugyldigt SendMessage (streng kønavn, LogMessage msg)

        {

MessageQueue messageQueue = null;

if (! MessageQueue.Exists (kønavn))

messageQueue = MessageQueue.Create (kønavn);

andet

messageQueue = ny MessageQueue (kønavn);

prøve

            {

messageQueue.Formatter = ny XmlMessageFormatter (ny type [] {typeof (LogMessage)});

messageQueue.Send (msg);

            }

fangst

            {

// Skriv kode her for at udføre den nødvendige fejlhåndtering.

            }

langt om længe

            {

messageQueue.Close ();

            }          

        }

Følgende kodestykke illustrerer, hvordan du kan oprette en forekomst af LogMessage-klassen, udfylde den med data og derefter påkalde SendMessage-metoden for at gemme den forekomst, der er oprettet i meddelelseskøen.

LogMessage msg = ny LogMessage ()

            {

MessageText = "Dette er en testmeddelelse.",

MessageTime = DateTime.Now

            };

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

Følgende kodeliste illustrerer, hvordan du kan læse den LogMessage-forekomst, der er gemt i meddelelseskøen.

privat statisk LogMessage ReceiveMessage (streng kønavn)

        {

if (! MessageQueue.Exists (kønavn))

returnere null;

MessageQueue messageQueue = ny MessageQueue (kønavn);

LogMessage logMessage = null;

prøve

            {

messageQueue.Formatter = ny XmlMessageFormatter (ny type [] {typeof (LogMessage)});

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

            }

fange {}

langt om længe

            {

messageQueue.Close ();

            }

return logMessage;

        }