Cara bekerja dengan MSMQ di C #

MSMQ (Antrian Mesej Microsoft) adalah antrian mesej yang tersedia secara lalai sebagai sebahagian daripada Windows. Cara yang boleh dipercayai untuk menghantar dan menerima mesej di seluruh sistem komputer, MSMQ menyediakan barisan yang berskala, selamat untuk utas, sederhana, dan mudah digunakan dan pada masa yang sama memberi anda peluang untuk meneruskan pesan di dalam pangkalan data Windows. MSDN menyatakan: "Teknologi Antrian Mesej (MSMQ) membolehkan aplikasi yang berjalan pada waktu yang berlainan untuk berkomunikasi di rangkaian dan sistem heterogen yang mungkin sementara di luar talian. Aplikasi menghantar mesej ke barisan dan membaca mesej dari barisan."

Biasanya, anda mempunyai dua aplikasi yang berbeza ketika bekerja dengan MSMQ - pengirim dan penerima. Apabila mesej dihantar oleh pengirim, yaitu aplikasi pengiriman, aplikasi penerima tidak perlu dalam keadaan pelaksanaan - pesan tersebut sebenarnya disimpan dalam barisan yang dikendalikan oleh sistem operasi host dan ini akan dihentikan sementara ketika diperlukan oleh aplikasi penerima.

Membuat Antrian

Anda boleh menghidupkan MSMQ dalam sistem anda melalui pilihan "Hidupkan atau matikan ciri Windows" dari panel kawalan. Setelah MSMQ dipasang di sistem anda, membuat barisan adalah mudah. Cukup pergi ke "Komputer Saya", klik kanan dan pilih Urus. Di tetingkap "Pengurusan Komputer" anda boleh membuat barisan baru dari nod "Antrian Mesej". Anda juga boleh membuat barisan secara teratur.

Pengaturcaraan MSMQ dalam C #

Untuk bekerja dengan MSMQ, anda perlu memasukkan ruang nama System.Messaging. Untuk membuat antrian secara terprogram, anda perlu memanfaatkan kaedah Buat dari kelas MessageQueue. Coretan kod berikut menggambarkan perkara ini.

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

Untuk membuat barisan dan menghantar mesej kepadanya, anda boleh menggunakan coretan kod berikut.

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

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

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

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

Sekarang, andaikan anda ingin memeriksa apakah barisan itu ada dan jika ada, hantarkan mesej kepadanya. Sekiranya barisan tidak ada, anda mungkin ingin membuat yang baru dan kemudian menghantarnya mesej. Inilah yang dilakukan oleh senarai kod berikut untuk anda.

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

}

      }

Senarai kod berikut menggambarkan bagaimana anda dapat memproses mesej yang disimpan dalam barisan mesej menggunakan 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;

        }

Seterusnya, anda boleh menggunakan kaedah ReadQueue untuk mendapatkan semula mesej yang disimpan dalam barisan mesej seperti yang ditunjukkan dalam coretan kod di bawah.

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

List lstMessages = ReadQueue(path);

Anda juga boleh menyimpan objek dalam barisan mesej. Sebagai contoh, anggap anda perlu menyimpan mesej log ke barisan. Mesej log disimpan dalam contoh kelas LogMessage yang mengandungi sifat yang diperlukan yang berkaitan dengan perincian mesej log. Begini rupa kelas LogMessage - Saya menjadikannya ringkas dengan hanya dua sifat sahaja.

public class LogMessage

    {

        public string MessageText { get; set; }

        public DateTime MessageTime { get; set; }

    }

Anda harus mengubah kelas LogMessage untuk memasukkan sifat-sifat lain yang diperlukan, seperti keterukan mesej, dan lain-lain. Kaedah berikut menggambarkan bagaimana anda dapat menyimpan contoh kelas LogMessage ke barisan mesej.

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

            }          

        }

Coretan kod berikut menggambarkan bagaimana anda dapat membuat instance kelas LogMessage, mengisi data dan kemudian menggunakan kaedah SendMessage untuk menyimpan instance yang dibuat dalam barisan mesej.

LogMessage msg = new LogMessage()

            {

                MessageText = "This is a test message.",

                MessageTime = DateTime.Now

            };

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

Senarai kod berikut menggambarkan bagaimana anda dapat membaca contoh LogMessage yang disimpan dalam barisan mesej.

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;

        }