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