Hatena::Groupsubtech

ういはるかぜの化学

Wednesday, February 23, 2011

MSMQ (Microsoft Message Queuing)を使う。 13:35  MSMQ (Microsoft Message Queuing)を使う。 - ういはるかぜの化学 を含むブックマーク はてなブックマーク -  MSMQ (Microsoft Message Queuing)を使う。 - ういはるかぜの化学

ちょっと.NETから簡単にメッセージキュー的なものを使いたいんだけど、何かないかなーと思って探したらMSMQの存在を思い出したので使ってみたり。

使い方があっているかよくわからいですが何となくサンプルコードを書いてみました。あ、ちなみにMSMQを使うにはWindowsの機能の有効化からMSMQのメッセージキューサーバーを有効化する必要があります

static void Main(string[] args)
{
    // MessageQueueの名前。ローカルコンピュータのプライベートキュー(外部から使わないので)のTestQueue
    var queueName = @".\Private$\TestQueue";
    
    // MessageQueue がない場合にはを作る
    if (!MessageQueue.Exists(queueName))
    {
        MessageQueue.Create(queueName);
    }

    // 引数が指定されていなければ受け側として、指定されていたら送信側として動作
    if (args.Length == 0)
    {
        Console.WriteLine("Waiting...");
        // 受信用のMessageQueue
        var messageQueue = new MessageQueue(queueName);
        // 既定のメッセージフォーマッタはXmlMessageFormatterなのでそれで String 型を戻せるようにする
        messageQueue.Formatter = new XmlMessageFormatter(new []{ typeof(String) });
        // 非同期で受信開始
        messageQueue.BeginReceive();
        messageQueue.ReceiveCompleted += (sender, e) =>
                                         {
                                             // メッセージ受信イベント
                                             Console.WriteLine("Message Received");
                                             
                                             // メッセージ取出し
                                             var receivedMessage = messageQueue.EndReceive(e.AsyncResult);
                                             Console.WriteLine(receivedMessage.Body);
                                             
                                             // なんか長い処理
                                             Thread.Sleep(new Random().Next(500, 1000));
                                             
                                             messageQueue.BeginReceive();
                                         };
        Console.ReadLine();
    }
    else
    {
        // 適当に10個ほどメッセージを送信する
        Console.WriteLine("Queue Message");
        Parallel.For(0, 10,
                    new ParallelOptions {MaxDegreeOfParallelism = 4},
                    i =>
                    {
                        var mq = new MessageQueue(queueName);
                        mq.Send(i.ToString() + ": " + args[0]);
                    });
    }
}

引数に何も渡さず起動すると受信モードで、引数を渡すとそれをキューに放り込みます

とりあえずコンパイルして2つぐらい引数なしで起動して、さらに別なコマンドプロンプトから ConsoleApplication1.exe Hauhau みたいに叩いてあげると何となくわかるかもしれません。

あ、あと遊んだあとはMessageQueue.Deleteしといたほうがいいかもしれませんね。

トラックバック - http://subtech.g.hatena.ne.jp/mayuki/20110223