MSMQ 安裝與程式撰寫

MSMQ(Microsoft Message Queuing)是一種訊息排程與交換技術,可以讓應用程式在不同的系統間傳遞訊息,並且能夠支持可靠的訊息傳遞。透過 MSMQ,C# 程式可以在不同部門間傳遞資料而不需要依賴即時網路連線,適用於跨部門合作的情況。

下文是如何使用 C# 進行 MSMQ 溝通的基本語法範例。此範例包括如何發送訊息到隊列,以及如何從隊列中接收訊息。

MSMQ 安裝

安裝

  • 開啟 : 控制台 > 程式與功能 > 開啟或關閉 Windows 功能
  • 點選 : Microsoft Message MSMQ 伺服器進行安裝

確認是否安裝

  • 本機右鍵 > 管理
  • 服務與應用程式 > 訊息佇列 ( 出現接收訊息地區)

發送訊息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Messaging;
using System.Text;
using System.Threading.Tasks;

namespace MSMQSendPractice
{
    class Program
    {
        static void Main(string[] args)
        {
            // 定義隊列名稱
            string queueName = @".\Private$\MyPrivateQueue";

            // 檢查隊列是否存在,如果不存在則創建
            if (!MessageQueue.Exists(queueName))
            {
                MessageQueue.Create(queueName);
            }

            // 創建 MessageQueue 對象
            using (MessageQueue queue = new MessageQueue(queueName))
            {
                // 創建消息
                Message msg = new Message
                {
                    Label = "TestMessage",
                    Body = "Hello, MSMQ!"
                };

                // 發送消息到隊列
                queue.Send(msg);

                Console.WriteLine("Message sent successfully.");
                Console.ReadKey();
            }
        }
    }
}
  • 執行發現在佇列中新增了 MyPrivateQueue
  • 標籤中發現有存訊息
  • XML 格式並且有剛剛傳送的訊息

接收訊息

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Messaging;
using System.Text;
using System.Threading.Tasks;

namespace MSMQReceviePractice
{
    class Program
    {
        static void Main(string[] args)
        {
            string queuePath = @".\Private$\MyPrivateQueue";
            
            if (!MessageQueue.Exists(queuePath))
            {
                MessageQueue.Create(queuePath);
            }

            // 啟動佇列接收
            StartReceivingMessages(queuePath);

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
        private static void StartReceivingMessages(string queuePath)
        {
            using (MessageQueue queue = new MessageQueue(queuePath))
            {
                queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });

                // 非同步接收佇列
                queue.ReceiveCompleted += new ReceiveCompletedEventHandler(OnReceiveCompleted);
                queue.BeginReceive();

                Console.WriteLine("Listening for messages...");
            }
        }

        private static async void OnReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            MessageQueue queue = (MessageQueue)sender;
            Message msg = queue.EndReceive(e.AsyncResult);
            string messageBody = msg.Body.ToString();
            Console.WriteLine("Received message: " + messageBody);

            // 處理佇列並透過DB (非同步)
            await ProcessMessageAndSaveToDatabaseAsync(messageBody);

            // 繼續非同步接收
            queue.BeginReceive();
        }

        private static async Task ProcessMessageAndSaveToDatabaseAsync(string messageBody)
        {
            string connectionString = "your_connection_string_here";

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                await connection.OpenAsync();

                string sql = "INSERT INTO Messages (MessageBody) VALUES (@MessageBody)";
                using (SqlCommand command = new SqlCommand(sql, connection))
                {
                    command.Parameters.AddWithValue("@MessageBody", messageBody);
                    await command.ExecuteNonQueryAsync();
                }
            }
        }


    }
}
  • 執行就會發現佇列會被用掉

參考連結: URL