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;

        }