Как да работите с MSMQ в C #

MSMQ (Microsoft Message Queuing) е опашка за съобщения, която е достъпна по подразбиране като част от Windows. Надежден начин за изпращане и получаване на съобщения в компютърни системи, MSMQ осигурява опашка, която е мащабируема, безопасна за нишки, проста и удобна за използване, като в същото време ви предоставя възможност да запазите съобщенията в базата данни на Windows. MSDN гласи: „Технологията за опашка на съобщения (MSMQ) позволява на приложенията, работещи по различно време, да комуникират през хетерогенни мрежи и системи, които могат да бъдат временно офлайн. Приложенията изпращат съобщения на опашки и четат съобщения от опашки.“

Обикновено имате две отделни приложения при работа с MSMQ - подателят и получателят. Когато съобщенията се изпращат от изпращача, т.е. изпращащото приложение, не е необходимо получаващото приложение да бъде в състояние на изпълнение - съобщенията всъщност се съхраняват в опашка, поддържана от операционната система на хоста, и те се изваждат от опашката, както и когато са необходими на получаващото приложение.

Създаване на опашка

Можете да включите MSMQ във вашата система чрез опцията „Включване или изключване на функциите на Windows“ от контролния панел. След като MSMQ бъде инсталиран във вашата система, създаването на опашка е лесно. Просто отидете на "Моят компютър", щракнете с десния бутон и изберете Управление. В прозореца "Управление на компютъра" можете да създадете нова опашка от възела "Опашка на съобщения". Можете също така да създадете опашка програмно.

Програмиране на MSMQ в C #

За да работите с MSMQ, ще трябва да включите пространството от имена System.Messaging. За да създадете опашка програмно, трябва да използвате метода Create на класа MessageQueue. Следният кодов фрагмент илюстрира това.

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

За да създадете опашка и да изпратите съобщение до нея, можете да използвате следния кодов фрагмент.

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

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

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

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

Сега, да предположим, че искате да проверите дали опашката съществува и ако има, изпратете съобщение до нея. Ако опашката не съществува, може да искате да създадете нова и след това да й изпратите съобщение. Точно това прави следният списък с кодове за вас.

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();

}

      }

Следният списък с кодове илюстрира как можете да обработвате съобщенията, съхранявани в опашката за съобщения, използвайки 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;

        }

След това можете да извикате метода ReadQueue, за да извлечете съобщенията, съхранени в опашката за съобщения, както е показано в кодовия фрагмент по-долу.

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

List lstMessages = ReadQueue(path);

Можете също да съхранявате обекти в опашката за съобщения. Като пример, да предположим, че трябва да съхраните дневник съобщение в опашката. Регистрационното съобщение се съхранява в екземпляр на класа LogMessage, който съдържа необходимите свойства, които се отнасят до подробностите за дневника. Ето как би изглеждал класът LogMessage - улесних го само с две свойства.

public class LogMessage

    {

        public string MessageText { get; set; }

        public DateTime MessageTime { get; set; }

    }

Трябва да модифицирате класа LogMessage, за да включите други необходими свойства, т.е. сериозност на съобщението и др. Следващият метод илюстрира как можете да съхранявате екземпляр на класа LogMessage в опашката за съобщения.

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();

            }          

        }

Следният кодов фрагмент илюстрира как можете да създадете екземпляр на класа LogMessage, да го попълните с данни и след това да извикате метода SendMessage, за да съхраните екземпляра, създаден в опашката за съобщения.

LogMessage msg = new LogMessage()

            {

                MessageText = "This is a test message.",

                MessageTime = DateTime.Now

            };

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

Следният списък с кодове илюстрира как можете да прочетете екземпляра LogMessage, съхраняван в опашката за съобщения.

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;

        }