Kako raditi s MSMQ-om u C #

MSMQ (Microsoft Message Queuing) je red poruka koji je prema zadanim postavkama dostupan kao dio sustava Windows. Pouzdan način slanja i primanja poruka u računalnim sustavima, MSMQ pruža red koji je skalabilan, siguran za nit, jednostavan i prikladan za upotrebu, a istovremeno vam pruža mogućnost zadržavanja poruka unutar Windows baze podataka. MSDN kaže: "Tehnologija čekanja poruka (MSMQ) omogućuje aplikacijama koje se izvode u različito vrijeme da komuniciraju kroz heterogene mreže i sustave koji mogu biti privremeno izvan mreže. Aplikacije šalju poruke u redove i čitaju poruke iz redova."

Tipično imate dvije različite aplikacije kada radite s MSMQ-om - pošiljatelja i primatelja. Kada poruke šalje pošiljatelj, tj. Aplikacija koja šalje, aplikacija koja prima ne mora biti u stanju izvršenja - poruke se zapravo spremaju u red koji održava glavni operativni sustav i one se stavljaju u red kako i kada se su potrebni aplikaciji koja prima.

Stvaranje reda čekanja

Možete uključiti MSMQ u svom sustavu putem opcije "Uključivanje ili isključivanje značajki sustava Windows" na upravljačkoj ploči. Jednom kada je MSMQ instaliran u vaš sustav, stvaranje reda je jednostavno. Samo idite na "Moje računalo", kliknite desnom tipkom i odaberite Upravljanje. U prozoru "Upravljanje računalom" možete stvoriti novi red iz čvora "Red čekanja poruka". Red također možete kreirati programski.

Programiranje MSMQ-a na jeziku C #

Da biste radili s MSMQ-om, trebali biste uključiti prostor imena System.Messaging. Da biste programski stvorili red, trebate koristiti metodu Create klase MessageQueue. Sljedeći isječak koda to ilustrira.

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

Da biste stvorili red i poslali mu poruku, možete upotrijebiti sljedeći isječak koda.

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

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

messageQueue.Label = "This is a test queue.";

messageQueue.Send("This is a test message.", "");

Sada, pretpostavimo da biste željeli provjeriti postoji li red i pošaljite li mu poruku. Ako red ne postoji, možda ćete htjeti stvoriti novi, a zatim mu poslati poruku. To je upravo ono što sljedeći popis kodova čini za vas.

static void Main(string[] args)

        {

            MessageQueue messageQueue = null;

            string description = "This is a test queue.";

            string message = "This is a test message.";

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

            try

            {

                if (MessageQueue.Exists(path))

                {

                    messageQueue = new MessageQueue(path);

                    messageQueue.Label = description;

                }

                else

                {

                    MessageQueue.Create(path);

                    messageQueue = new MessageQueue(path);

                    messageQueue.Label = description;

                }

                messageQueue.Send(message);

            }

            catch

            {

                throw;

            }

finally

{

           messageQueue.Dispose();

}

      }

Sljedeći popis kodova ilustrira kako možete obraditi poruke pohranjene u redu poruka pomoću C #.

private static List ReadQueue(string path)

        {

            List lstMessages = new List();

            using (MessageQueue messageQueue = new MessageQueue(path))

            {

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

                foreach (System.Messaging.Message message in messages)

                {

                    message.Formatter = new XmlMessageFormatter(

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

                    string msg = message.Body.ToString();

                    lstMessages.Add(msg);

                }

            }

            return lstMessages;

        }

Dalje, možete pozvati metodu ReadQueue za dohvaćanje poruka pohranjenih u redu poruka, kao što je prikazano u isječku koda u nastavku.

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

List lstMessages = ReadQueue(path);

Objekte možete pohraniti i u red poruka. Kao primjer, pretpostavimo da trebate spremiti poruku dnevnika u red čekanja. Poruka dnevnika pohranjuje se u instanci klase LogMessage koja sadrži potrebna svojstva koja se odnose na detalje poruke dnevnika. Evo kako bi izgledala klasa LogMessage - pojednostavio sam je sa samo dva svojstva.

public class LogMessage

    {

        public string MessageText { get; set; }

        public DateTime MessageTime { get; set; }

    }

Trebali biste izmijeniti klasu LogMessage tako da uključuje druga potrebna svojstva, npr. Ozbiljnost poruke itd. Sljedeća metoda ilustrira kako možete pohraniti primjerak klase LogMessage u red poruka.

private static void SendMessage(string queueName, LogMessage msg)

        {

            MessageQueue messageQueue = null;

            if (!MessageQueue.Exists(queueName))

                messageQueue = MessageQueue.Create(queueName);

            else

                messageQueue = new MessageQueue(queueName);          

            try

            {

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

                messageQueue.Send(msg);

            }

            catch

            {

                //Write code here to do the necessary error handling.

            }

            finally

            {

                messageQueue.Close();

            }          

        }

Sljedeći isječak koda ilustrira kako možete stvoriti instancu klase LogMessage, popuniti je podacima, a zatim pozvati metodu SendMessage za spremanje instance stvorene u redu poruka.

LogMessage msg = new LogMessage()

            {

                MessageText = "This is a test message.",

                MessageTime = DateTime.Now

            };

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

Sljedeći popis kodova ilustrira kako možete čitati instancu LogMessage spremljenu u redu poruka.

private static LogMessage ReceiveMessage(string queueName)

        {

            if (!MessageQueue.Exists(queueName))

                return null;

            MessageQueue messageQueue = new MessageQueue(queueName);

            LogMessage logMessage = null;

            try

            {

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

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

            }

            catch { }

            finally

            {

                messageQueue.Close();

            }

            return logMessage;

        }