Programiranje

Kako delati z MSMQ v C #

MSMQ (Microsoftova čakalna vrsta sporočil) je čakalna vrsta sporočil, ki je privzeto na voljo kot del sistema Windows. MSMQ kot zanesljiv način pošiljanja in prejemanja sporočil v računalniških sistemih ponuja čakalno vrsto, ki je razširljiva, varna pred nitmi, preprosta in priročna za uporabo, hkrati pa vam omogoča, da sporočila ohranite znotraj baze podatkov Windows. MSDN navaja: "Tehnologija čakalnih sporočil (MSMQ) omogoča aplikacijam, ki se izvajajo ob različnih časih, komunikacijo v heterogenih omrežjih in sistemih, ki so morda začasno brez povezave. Aplikacije pošiljajo sporočila v čakalne vrste in berejo sporočila iz čakalnih vrst."

Običajno imate pri delu z MSMQ dve različni aplikaciji - pošiljatelja in sprejemnika. Ko sporočila pošilja pošiljatelj, tj. Pošiljateljska aplikacija, prejemna aplikacija ni nujno v stanju izvrševanja - sporočila so dejansko shranjena v čakalni vrsti, ki jo vzdržuje gostiteljski operacijski sistem, in so postavljena v čakalno vrsto, kadar in ko ki jih potrebuje prejemna aplikacija.

Ustvarjanje čakalne vrste

MSMQ lahko v sistemu vklopite z možnostjo »Vklop ali izklop funkcij sistema Windows« na nadzorni plošči. Ko je MSMQ nameščen v vašem sistemu, je čakalna vrsta preprosta. Pojdite na "Moj računalnik", z desno miškino tipko izberite Upravljanje. V oknu »Computer Management« lahko iz vozlišča »Queueing Message« ustvarite novo čakalno vrsto. Čakalno vrsto lahko ustvarite tudi programsko.

Programiranje MSMQ v jeziku C #

Če želite delati z MSMQ, morate vključiti imenski prostor System.Messaging. Če želite programsko ustvariti čakalno vrsto, morate uporabiti metodo Create razreda MessageQueue. Naslednji delček kode to ponazarja.

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

Če želite ustvariti čakalno vrsto in ji poslati sporočilo, lahko uporabite naslednji delček kode.

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

messageQueue = nova MessageQueue (@ ". \ Zasebno $ \");

messageQueue.Label = "To je preizkusna vrsta.";

messageQueue.Send ("To je testno sporočilo.", "");

Recimo, da bi radi preverili, ali čakalna vrsta obstaja, in če obstaja, ji pošljite sporočilo. Če vrsta ne obstaja, boste morda želeli ustvariti novo in ji poslati sporočilo. To je točno tisto, kar za vas naredi naslednji seznam kod.

statična praznina Main (string [] args)

        {

MessageQueue messageQueue = null;

string description = "To je preizkusna vrsta.";

string message = "To je testno sporočilo.";

niz poti = @ ". \ Zasebno $ \";

poskusite

            {

if (MessageQueue.Exists (pot))

                {

messageQueue = nova MessageQueue (pot);

messageQueue.Label = opis;

                }

drugače

                {

MessageQueue.Create (pot);

messageQueue = nova MessageQueue (pot);

messageQueue.Label = opis;

                }

messageQueue.Send (sporočilo);

            }

ulov

            {

metati;

            }

končno

{

messageQueue.Dispose ();

}

      }

Naslednji seznam kod ponazarja, kako lahko s C # obdelate sporočila, shranjena v čakalni vrsti sporočil.

zasebni statični seznam ReadQueue (pot niza)

        {

Seznam lstMessages = nov seznam ();

z uporabo (MessageQueue messageQueue = nova MessageQueue (pot))

            {

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

foreach (sporočilo System.Messaging.Message v sporočilih)

                {

message.Formatter = nov XmlMessageFormatter (

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

niz msg = message.Body.ToString ();

lstMessages.Add (msg);

                }

            }

vrni lstMessages;

        }

Nato lahko prikličete metodo ReadQueue, da pridobite sporočila, shranjena v čakalni vrsti sporočil, kot je prikazano v spodnjem delčku kode.

niz poti = @ ". \ Zasebno $ \";

Seznam lstMessages = ReadQueue (pot);

Predmete lahko shranite tudi v čakalno vrsto sporočil. Denimo, da morate v čakalno vrsto shraniti dnevniško sporočilo. Sporočilo dnevnika je shranjeno v primerku razreda LogMessage, ki vsebuje potrebne lastnosti, ki se nanašajo na podrobnosti sporočila dnevnika. Evo, kako bi izgledal razred LogMessage - poenostavil sem ga s samo dvema lastnostma.

javni razred LogMessage

    {

javni niz MessageText {get; set; }

javni DateTime MessageTime {get; set; }

    }

Spremeniti morate razred LogMessage, da bo vključeval druge potrebne lastnosti, npr. Resnost sporočila itd. Naslednja metoda prikazuje, kako lahko primerek razreda LogMessage shranite v čakalno vrsto sporočil.

zasebna statična void SendMessage (niz čakalne vrste, sporočilo LogMessage)

        {

MessageQueue messageQueue = null;

if (! MessageQueue.Exists (queueName))

messageQueue = MessageQueue.Create (queueName);

drugače

messageQueue = novo MessageQueue (queueName);

poskusite

            {

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

messageQueue.Send (msg);

            }

ulov

            {

// Tukaj napišite kodo, da opravite potrebno obdelavo napak.

            }

končno

            {

messageQueue.Close ();

            }          

        }

Naslednji delček kode prikazuje, kako lahko ustvarite primerek razreda LogMessage, ga zapolnite s podatki in nato prikličete metodo SendMessage za shranjevanje primerka, ustvarjenega v čakalni vrsti sporočil.

LogMessage msg = novo LogMessage ()

            {

MessageText = "To je testno sporočilo.",

MessageTime = DateTime.Zdaj

            };

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

Naslednji seznam kod ponazarja, kako lahko berete primerek LogMessage, shranjen v čakalni vrsti sporočil.

zasebni statični LogMessage ReceiveMessage (string queueName)

        {

if (! MessageQueue.Exists (queueName))

vrni null;

MessageQueue messageQueue = novo MessageQueue (queueName);

LogMessage logMessage = null;

poskusite

            {

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

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

            }

ulov {}

končno

            {

messageQueue.Close ();

            }

vrnitev logMessage;

        }

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