Programavimas

Kaip dirbti su MSMQ C #

MSMQ („Microsoft Message Queuing“) yra pranešimų eilė, kuri pagal numatytuosius nustatymus yra prieinama kaip „Windows“ dalis. Patikimas pranešimų siuntimo ir priėmimo būdas kompiuterinėse sistemose. MSMQ pateikia eilę, kuri yra keičiama, saugi siūlams, paprasta ir patogi naudoti, tuo pačiu suteikdama galimybę išsaugoti pranešimus „Windows“ duomenų bazėje. MSDN teigia: "Message Queuing (MSMQ) technologija leidžia skirtingu metu veikiančioms programoms bendrauti nevienalyčiuose tinkluose ir sistemose, kurios gali būti laikinai neprisijungusios. Programos siunčia pranešimus į eiles ir skaito pranešimus iš eilių."

Paprastai dirbdami su MSMQ turite dvi skirtingas programas - siuntėją ir imtuvą. Kai pranešimus siunčia siuntėjas, ty siunčianti programa, priimančiosios programos nebūtinai turi būti vykdymo būsenos - pranešimai iš tikrųjų saugomi eilėje, kurią palaiko pagrindinė operacinė sistema, ir jie paliekami eilėje, kai ir kada yra reikalingi gaunančiajai programai.

Eilės kūrimas

Savo sistemoje galite įjungti MSMQ naudodami valdymo skydo parinktį „Įjungti arba išjungti„ Windows “funkcijas“. Įdiegus MSMQ į jūsų sistemą, eilę sukurti paprasta. Tiesiog eikite į „Mano kompiuteris“, dešiniuoju pelės mygtuku spustelėkite ir pasirinkite Tvarkyti. Lange „Kompiuterio valdymas“ galite sukurti naują eilę iš mazgo „Pranešimų eilės nustatymas“. Taip pat galite sukurti eilę programiškai.

MSMQ programavimas C #

Norėdami dirbti su MSMQ, turėsite įtraukti „System.Messaging“ vardų sritį. Norėdami sukurti eilę programiškai, turite panaudoti „MessageQueue“ klasės metodą Kurti. Tai iliustruoja šis kodo fragmentas.

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

Norėdami sukurti eilę ir išsiųsti jai pranešimą, galite naudoti šį kodo fragmentą.

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

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

messageQueue.Label = "Tai bandomoji eilė.";

messageQueue.Send ("Tai bandomasis pranešimas.", "");

Tarkime, kad norėtumėte patikrinti, ar eilė egzistuoja, ir, jei taip yra, nusiųskite jai pranešimą. Jei eilės nėra, galite sukurti naują ir išsiųsti jai pranešimą. Būtent tai jums daro šis kodų sąrašas.

static void Main (string [] args)

        {

MessageQueue messageQueue = null;

string description = "Tai bandomoji eilė.";

string message = "Tai bandomasis pranešimas.";

eilutės kelias = @ ". \ Private $ \";

bandyti

            {

jei (MessageQueue.Exists (kelias))

                {

messageQueue = nauja MessageQueue (kelias);

messageQueue.Label = aprašymas;

                }

Kitas

                {

MessageQueue.Create (kelias);

messageQueue = nauja MessageQueue (kelias);

messageQueue.Label = aprašymas;

                }

messageQueue.Send (žinutė);

            }

pagauti

            {

mesti;

            }

pagaliau

{

messageQueue.Dispose ();

}

      }

Šis kodų sąrašas parodo, kaip galite apdoroti pranešimų eilėje saugomus pranešimus naudodami C #.

privatus statinis „ListQueue“ sąrašas (eilutės kelias)

        {

Sąrašas lstMessages = naujas sąrašas ();

naudojant [MessageQueue messageQueue = nauja MessageQueue (kelias)]

            {

System.Messaging.Message [] pranešimai = messageQueue.GetAllMessages ();

foreach (System.Messaging.Message message in messages)

                {

message.Formatter = new XmlMessageFormatter (

nauja eilutė [] {"System.String, mscorlib"});

string msg = message.Body.ToString ();

lstMessages.Add (msg);

                }

            }

grąžinti lstMessages;

        }

Tada galite pasinaudoti „ReadQueue“ metodu, kad gautumėte pranešimų eilėje saugomus pranešimus, kaip parodyta žemiau esančiame kodo fragmente.

eilutės kelias = @ ". \ Private $ \";

„LstMessages“ sąrašas = „ReadQueue“ (kelias);

Taip pat galite saugoti objektus pranešimų eilėje. Tarkime, kad jums reikia išsaugoti žurnalo pranešimą eilėje. Žurnalo pranešimas saugomas „LogMessage“ klasės egzemplioriuje, kuriame yra būtinos ypatybės, susijusios su išsamia žurnalo pranešimo informacija. Štai kaip atrodys „LogMessage“ klasė - aš tai padariau paprastą, turėdamas tik dvi savybes.

viešosios klasės „LogMessage“

    {

viešoji eilutė „MessageText“ {get; rinkinys; }

public DateTime MessageTime {get; rinkinys; }

    }

Turėtumėte modifikuoti „LogMessage“ klasę, kad būtų įtrauktos kitos būtinos ypatybės, t. Y. Pranešimo sunkumas ir kt. Šis metodas parodo, kaip galite išsaugoti „LogMessage“ klasės egzempliorių pranešimų eilėje.

privatus statinis negaliojantis „SendMessage“ (eilutės eilės pavadinimas, „LogMessage“ pranešimas)

        {

MessageQueue messageQueue = null;

jei (! MessageQueue.Exists (queueName))

messageQueue = MessageQueue.Create (queueName);

Kitas

messageQueue = nauja MessageQueue (queueName);

bandyti

            {

messageQueue.Formatter = new XmlMessageFormatter (new Type [] {typeof (LogMessage)});

messageQueue.Send (msg);

            }

pagauti

            {

// Čia parašykite kodą, kad atliktumėte reikiamą klaidų tvarkymą.

            }

pagaliau

            {

messageQueue.Close ();

            }          

        }

Šis kodo fragmentas parodo, kaip galite sukurti „LogMessage“ klasės egzempliorių, užpildyti jį duomenimis ir tada iškviesti „SendMessage“ metodą, kad išsaugotumėte egzempliorių, sukurtą pranešimų eilėje.

LogMessage msg = new LogMessage ()

            {

MessageText = "Tai bandomasis pranešimas.",

MessageTime = DateTime.Now

            };

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

Šis kodų sąrašas parodo, kaip galite skaityti „LogMessage“ egzempliorių, saugomą pranešimų eilėje.

privati ​​statinė „LogMessage“ „ReceiveMessage“ (eilutė eilės pavadinimas)

        {

jei (! MessageQueue.Exists (queueName))

return null;

MessageQueue messageQueue = nauja MessageQueue (queueName);

LogMessage logMessage = null;

bandyti

            {

messageQueue.Formatter = new XmlMessageFormatter (new Type [] {typeof (LogMessage)});

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

            }

pagauti {}

pagaliau

            {

messageQueue.Close ();

            }

return logMessage;

        }

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