Programmering

Hvordan jobbe med MSMQ i C #

MSMQ (Microsoft Message Queuing) er en meldingskø som er tilgjengelig som standard som en del av Windows. En pålitelig måte å sende og motta meldinger på tvers av datasystemer, gir MSMQ en kø som er skalerbar, trådsikker, enkel og praktisk å bruke, samtidig som du gir deg muligheten til å vedvare meldingene i Windows-databasen. MSDN sier: "Message Queuing (MSMQ) -teknologi gjør det mulig for applikasjoner som kjører på forskjellige tidspunkter å kommunisere på tvers av heterogene nettverk og systemer som kan være midlertidig offline. Applikasjoner sender meldinger til køer og leser meldinger fra køer."

Vanligvis har du to forskjellige applikasjoner når du arbeider med MSMQ - avsenderen og mottakeren. Når meldingene sendes av avsenderen, dvs. sendesøknaden, trenger ikke mottakersøknaden være i kjøringstilstand - meldingene lagres faktisk i en kø som vedlikeholdes av vertsoperativsystemet, og disse blir avkjørt når og når de er nødvendig av den mottakende søknaden.

Opprette en kø

Du kan slå på MSMQ i systemet ditt via alternativet "Slå Windows-funksjoner på eller av" fra kontrollpanelet. Når MSMQ er installert i systemet, er det enkelt å opprette en kø. Bare gå til "Min datamaskin", høyreklikk og velg Administrer. I vinduet "Computer Management" kan du opprette en ny kø fra "Message Queuing" -noden. Du kan også opprette en kø programmatisk.

Programmering MSMQ i C #

For å jobbe med MSMQ, må du inkludere navneområdet System.Messaging. For å opprette en kø programmatisk, må du utnytte Create-metoden i MessageQueue-klassen. Følgende kodebit illustrerer dette.

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

For å opprette en kø og sende en melding til den, kan du bruke følgende kodebit.

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

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

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

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

Anta at du vil sjekke om køen eksisterer, og hvis den gjør det, send en melding til den. Hvis køen ikke eksisterer, vil du kanskje opprette en ny og deretter sende den en melding. Dette er nøyaktig hva følgende kodeliste gjør for deg.

statisk tomrom Main (streng [] args)

        {

MessageQueue messageQueue = null;

strengbeskrivelse = "Dette er en testkø.";

string message = "Dette er en testmelding.";

strengsti = @ ". \ Privat $ \";

prøve

            {

hvis (MessageQueue.Exists (sti))

                {

messageQueue = ny MessageQueue (sti);

messageQueue.Label = beskrivelse;

                }

ellers

                {

MessageQueue.Create (sti);

messageQueue = ny MessageQueue (sti);

messageQueue.Label = beskrivelse;

                }

messageQueue.Send (melding);

            }

å fange

            {

kaste;

            }

endelig

{

messageQueue.Dispose ();

}

      }

Følgende kodeliste illustrerer hvordan du kan behandle meldingene som er lagret i en meldingskø ved hjelp av C #.

privat statisk liste ReadQueue (strengbane)

        {

Liste lstMessages = ny liste ();

bruker (MessageQueue messageQueue = ny MessageQueue (sti))

            {

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

foreach (System.Messaging.Message melding i meldinger)

                {

melding.Formatter = ny XmlMessageFormatter (

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

streng msg = melding.Body.ToString ();

lstMessages.Add (msg);

                }

            }

return lstMessages;

        }

Deretter kan du påkalle ReadQueue-metoden for å hente meldingene som er lagret i meldingskøen som vist i kodebiten nedenfor.

strengsti = @ ". \ Privat $ \";

Liste lstMessages = ReadQueue (sti);

Du kan også lagre objekter i meldingskøen. Anta at du må lagre en loggmelding i køen. Loggmeldingen lagres i en forekomst av klassen LogMessage som inneholder de nødvendige egenskapene som gjelder detaljene i loggmeldingen. Slik ser LogMessage-klassen ut - jeg har gjort det enkelt med bare to egenskaper.

offentlig klasse LogMessage

    {

offentlig streng MessageText {get; sett; }

offentlig DateTime MessageTime {get; sett; }

    }

Du bør endre LogMessage-klassen for å innlemme andre nødvendige egenskaper, dvs. meldingsgraden, etc. Følgende metode illustrerer hvordan du kan lagre en forekomst av LogMessage-klassen i meldingskøen.

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

        {

MessageQueue messageQueue = null;

if (! MessageQueue.Exists (queueName))

messageQueue = MessageQueue.Create (kønavn);

ellers

messageQueue = ny MessageQueue (kønavn);

prøve

            {

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

messageQueue.Send (msg);

            }

å fange

            {

// Skriv kode her for å gjøre den nødvendige feilhåndteringen.

            }

endelig

            {

messageQueue.Close ();

            }          

        }

Følgende kodebit illustrerer hvordan du kan opprette en forekomst av LogMessage-klassen, fylle den ut med data og deretter påkalle SendMessage-metoden for å lagre forekomsten som er opprettet i meldingskøen.

LogMessage msg = ny LogMessage ()

            {

MessageText = "Dette er en testmelding.",

MessageTime = DateTime.Now

            };

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

Følgende kodeliste illustrerer hvordan du kan lese LogMessage-forekomsten som er lagret i meldingskøen.

privat statisk LogMessage ReceiveMessage (streng kønavn)

        {

if (! MessageQueue.Exists (queueName))

return 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 { }

endelig

            {

messageQueue.Close ();

            }

retur logMessage;

        }

$config[zx-auto] not found$config[zx-overlay] not found