כיצד לעבוד עם MSMQ ב- C #

MSMQ (Microsoft Message Queuing) הוא תור הודעות שזמין כברירת מחדל כחלק מ- Windows. דרך אמינה לשליחה וקבלה של הודעות במערכות מחשב, MSMQ מספק תור שניתן להרחבה, בטיחות אשכולות, פשוט ונוח לשימוש, ובמקביל מאפשר לך לשמור על ההודעות בתוך מסד הנתונים של Windows. ה- MSDN קובע: "טכנולוגיית Message Queuing (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;

        }