C#でMSMQを操作する方法
MSMQ(Microsoftメッセージキュー)は、Windowsの一部としてデフォルトで使用できるメッセージキューです。コンピュータシステム間でメッセージを送受信する信頼性の高い方法であるMSMQは、スケーラブルでスレッドセーフ、シンプル、そして使いやすいキューを提供すると同時に、Windowsデータベース内でメッセージを永続化する機会を提供します。MSDNは次のように述べています。「メッセージキューイング(MSMQ)テクノロジにより、異なる時間に実行されているアプリケーションが、一時的にオフラインになっている可能性のある異種ネットワークやシステム間で通信できます。アプリケーションはキューにメッセージを送信し、キューからメッセージを読み取ります。」
通常、MSMQを使用する場合、送信者と受信者の2つの異なるアプリケーションがあります。メッセージが送信者、つまり送信アプリケーションによって送信される場合、受信アプリケーションは実行状態である必要はありません。メッセージは実際にはホストオペレーティングシステムによって維持されるキューに格納され、メッセージが送信されたときにキューから取り出されます。受信アプリケーションで必要です。
キューの作成
コントロールパネルの[Windowsの機能をオンまたはオフにする]オプションを使用して、システムでMSMQをオンにすることができます。MSMQがシステムにインストールされると、キューの作成は簡単です。「マイコンピュータ」に移動し、右クリックして「管理」を選択します。[コンピュータの管理]ウィンドウで、[メッセージキュー]ノードから新しいキューを作成できます。プログラムでキューを作成することもできます。
C#でのMSMQのプログラミング
MSMQを使用するには、System.Messaging名前空間を含める必要があります。プログラムでキューを作成するには、MessageQueueクラスのCreateメソッドを利用する必要があります。次のコードスニペットはこれを示しています。
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クラスは次のようになります。2つのプロパティのみを使用して単純にしました。
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;
}