Bagaimana bekerja dengan MSMQ di C #

MSMQ (Microsoft Message Queuing) adalah antrian pesan yang tersedia secara default sebagai bagian dari Windows. Cara yang andal untuk mengirim dan menerima pesan di seluruh sistem komputer, MSMQ menyediakan antrian yang dapat diskalakan, aman untuk thread, sederhana, dan nyaman digunakan sekaligus memberi Anda kesempatan untuk menyimpan pesan di dalam database Windows. MSDN menyatakan: "Teknologi Antrian Pesan (MSMQ) memungkinkan aplikasi yang berjalan pada waktu yang berbeda untuk berkomunikasi melalui jaringan dan sistem yang heterogen yang mungkin sementara offline. Aplikasi mengirim pesan ke antrian dan membaca pesan dari antrian."

Biasanya, Anda memiliki dua aplikasi berbeda saat bekerja dengan MSMQ - pengirim dan penerima. Ketika pesan dikirim oleh pengirim, yaitu, aplikasi pengirim, aplikasi penerima tidak perlu dalam keadaan eksekusi - pesan sebenarnya disimpan dalam antrian yang dipelihara oleh sistem operasi host dan ini akan dibatalkan antriannya saat dan kapan pesan tersebut. dibutuhkan oleh aplikasi penerima.

Membuat Antrian

Anda dapat mengaktifkan MSMQ di sistem Anda melalui opsi "Aktifkan atau nonaktifkan fitur Windows" dari panel kontrol. Setelah MSMQ diinstal di sistem Anda, membuat antrean menjadi mudah. Cukup buka "Komputer Saya", klik kanan dan pilih Kelola. Di jendela "Manajemen Komputer" Anda dapat membuat antrian baru dari node "Antrian Pesan". Anda juga dapat membuat antrian lewat program.

Pemrograman MSMQ di C #

Untuk bekerja dengan MSMQ, Anda harus menyertakan namespace System.Messaging. Untuk membuat antrian lewat program, Anda perlu memanfaatkan metode Create dari kelas MessageQueue. Cuplikan kode berikut menggambarkan hal ini.

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

Untuk membuat antrian dan mengirim pesan ke sana, Anda dapat menggunakan potongan kode berikut.

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

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

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

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

Sekarang, misalkan Anda ingin memeriksa apakah antrian ada dan jika ya, kirim pesan ke sana. Jika antrian tidak ada, Anda mungkin ingin membuat yang baru dan kemudian mengirimkannya pesan. Inilah yang sebenarnya dilakukan daftar kode 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();

}

      }

Daftar kode berikut menggambarkan bagaimana Anda dapat memproses pesan yang disimpan dalam antrian pesan 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;

        }

Selanjutnya, Anda dapat menjalankan metode ReadQueue untuk mengambil pesan yang disimpan dalam antrian pesan seperti yang ditunjukkan pada potongan kode di bawah ini.

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

List lstMessages = ReadQueue(path);

Anda juga dapat menyimpan objek dalam antrian pesan. Sebagai contoh, misalkan Anda perlu menyimpan pesan log ke antrian. Pesan log disimpan dalam instance kelas LogMessage yang berisi properti yang diperlukan yang berkaitan dengan detail pesan log. Beginilah tampilan kelas LogMessage - Saya telah membuatnya sederhana hanya dengan dua properti saja.

public class LogMessage

    {

        public string MessageText { get; set; }

        public DateTime MessageTime { get; set; }

    }

Anda harus mengubah kelas LogMessage untuk memasukkan properti lain yang diperlukan, misalnya tingkat keparahan pesan, dll. Metode berikut menggambarkan bagaimana Anda dapat menyimpan instance kelas LogMessage ke antrian pesan.

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

            }          

        }

Cuplikan kode berikut mengilustrasikan bagaimana Anda dapat membuat instance kelas LogMessage, mengisinya dengan data, lalu menjalankan metode SendMessage untuk menyimpan instance yang dibuat dalam antrean pesan.

LogMessage msg = new LogMessage()

            {

                MessageText = "This is a test message.",

                MessageTime = DateTime.Now

            };

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

Daftar kode berikut menggambarkan bagaimana Anda dapat membaca contoh LogMessage yang disimpan dalam antrian pesan.

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;

        }