MSMQサンプルアプリケーションを作成するために最低限必要なもの


112

私は1時間以上研究していて、C#でMSMQを使用する方法の優れたサンプルと、Message Queueに関する本の1つの完全な章さえ見つけました...しかし、簡単なテストで必要なのは、このシナリオだけです。簡単なデモのために、完璧な方法で:

「アプリケーションA」:メッセージをメッセージキューに書き込みます。(アプリケーションAはC#Windowsサービスです)次に、「アプリケーションB」(C#winFormsアプリです)を開き、MSMQを確認すると、新しいメッセージがあることがわかります。

それだけです...簡単なデモに必要なすべてです。

誰かがこれのコードサンプルを手伝ってくれませんか?とても有難い。


14
反対票は何ですか?あなたがトピックについて何かを知っているなら、OKは私たちの残りを教えます。
ボーン

4
@Sascha:私の投稿の冒頭を読みます:「私は1時間以上調査しており、C#でMSMQを使用する方法の優れたサンプルと、Message Queueに関する本の1つの完全な章を見つけています...しかし、すべてをすばやくテストするにはこのシナリオは、完璧な方法ではなく、簡単なデモのためだけにカバーする必要があります」
Bohn


回答:


131
//From Windows Service, use this code
MessageQueue messageQueue = null;
if (MessageQueue.Exists(@".\Private$\SomeTestName"))
{
    messageQueue = new MessageQueue(@".\Private$\SomeTestName");
    messageQueue.Label = "Testing Queue";
}
else
{
    // Create the Queue
    MessageQueue.Create(@".\Private$\SomeTestName");
    messageQueue = new MessageQueue(@".\Private$\SomeTestName");
    messageQueue.Label = "Newly Created Queue";
}
messageQueue.Send("First ever Message is sent to MSMQ", "Title");

//From Windows application
MessageQueue messageQueue = new MessageQueue(@".\Private$\SomeTestName");
System.Messaging.Message[] messages = messageQueue.GetAllMessages();

foreach (System.Messaging.Message message in messages)
{
    //Do something with the message.
}
// after all processing, delete all the messages
messageQueue.Purge();

より複雑なシナリオでは、メッセージオブジェクトを使用してメッセージを送信し、その中に独自のクラスオブジェクトをラップして、クラスをシリアル化可能としてマークできます。また、MSMQがシステムにインストールされていることを確認してください


1
質問:MessageQueueを作成している最上位に、これらの両方が必要ですか?MessageQueue.Create(@ "。\ Private $ \ SomeTestName"); messageQueue = new MessageQueue(@ "。\ Private $ \ SomeTestName");
ボーン

3
はい、両方のステートメントが必要です。1つは実際にMSMQを作成し、もう1つはMSMQをパスで初期化するだけです
Anand

6
魅力のように働いた...あなたの願いの1つが今日実現することを願っています...あなたは今日私にとって大きなことを解決しました。
ボーン

2
小さなタイプミス:messageQueue = new MessageQueue(@ "。\ Private $ \ SomeTestName"); System.Messaging.Message [] messages = queue.GetAllMessages(); messageQueue = new MessageQueue(@ "。\ Private $ \ SomeTestName");にする必要があります。System.Messaging.Message [] messages = messageQueue.GetAllMessages();
Kjensen 2013年

4
キューの出力をコンソールに出力するには、出力ループの本文に「message.Formatter = new XmlMessageFormatter(new String [] {"System.String、mscorlib"}); Console.Write(message.Body .ToString()); "。MSMQは物事をシリアル化されたオブジェクトとして渡すため、受け取ったオブジェクトを元の形式に逆シリアル化する方法をMSMQに伝える必要があります。
Contango、2014年

16

おそらく、以下のコードは、誰かがMSMQを簡単に紹介するのに役立つでしょう。

だから私はあなたがソリューションで3つのアプリを作成することをお勧めします:

  1. MessageTo(Windowsフォーム)1つのボタンを追加します。
  2. MessageFrom(Windowsフォーム)リッチテキストボックスを1つ追加します。
  3. MyMessage(クラスライブラリ)1つのクラスを追加します。

過去のコードをコピーして試してください。MSMQが MS Windowsにインストールされており、プロジェクト1および2がを参照していることを確認してくださいSystem.Messaging

1. MessageTo(Windowsフォーム)1つのボタンを追加します。

using System;
using System.Messaging;
using System.Windows.Forms;

namespace MessageTo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            #region Create My Own Queue 

            MessageQueue messageQueue = null;
            if (MessageQueue.Exists(@".\Private$\TestApp1"))
            {
                messageQueue = new MessageQueue(@".\Private$\TestApp1");
                messageQueue.Label = "MyQueueLabel";
            }
            else
            {
                // Create the Queue
                MessageQueue.Create(@".\Private$\TestApp1");
                messageQueue = new MessageQueue(@".\Private$\TestApp1");
                messageQueue.Label = "MyQueueLabel";
            }

            #endregion

            MyMessage.MyMessage m1 = new MyMessage.MyMessage();
            m1.BornPoint = DateTime.Now;
            m1.LifeInterval = TimeSpan.FromSeconds(5);
            m1.Text = "Command Start: " + DateTime.Now.ToString();

            messageQueue.Send(m1);
        }
    }
}

2. MessageFrom(Windowsフォーム)1つのrichtextboxを追加します。

using System;
using System.ComponentModel;
using System.Linq;
using System.Messaging;
using System.Windows.Forms;

namespace MessageFrom
{
    public partial class Form1 : Form
    {
        Timer t = new Timer();
        BackgroundWorker bw1 = new BackgroundWorker();
        string text = string.Empty;

        public Form1()
        {
            InitializeComponent();

            t.Interval = 1000;
            t.Tick += T_Tick;
            t.Start();

            bw1.DoWork += (sender, args) => args.Result = Operation1();
            bw1.RunWorkerCompleted += (sender, args) =>
            {
                if ((bool)args.Result)
                {
                    richTextBox1.Text += text;
                }
            };
        }

        private object Operation1()
        {
            try
            {
                if (MessageQueue.Exists(@".\Private$\TestApp1"))
                {
                    MessageQueue messageQueue = new MessageQueue(@".\Private$\TestApp1");
                    messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(MyMessage.MyMessage) });


                    System.Messaging.Message[] messages = messageQueue.GetAllMessages();

                    var isOK = messages.Count() > 0 ? true : false;
                    foreach (System.Messaging.Message m in messages)
                    {
                        try
                        {
                            var command = (MyMessage.MyMessage)m.Body;
                            text = command.Text + Environment.NewLine;
                        }
                        catch (MessageQueueException ex)
                        {
                        }
                        catch (Exception ex)
                        {
                        }
                    }                   
                    messageQueue.Purge(); // after all processing, delete all the messages
                    return isOK;
                }
            }
            catch (MessageQueueException ex)
            {
            }
            catch (Exception ex)
            {
            }

            return false;
        }

        private void T_Tick(object sender, EventArgs e)
        {
            t.Enabled = false;

            if (!bw1.IsBusy)
                bw1.RunWorkerAsync();

            t.Enabled = true;
        }
    }
}

3. MyMessage(クラスライブラリ)1つのクラスを追加します。

using System;

namespace MyMessage
{
    [Serializable]
    public sealed class MyMessage
    {
        public TimeSpan LifeInterval { get; set; }

        public DateTime BornPoint { get; set; }

        public string Text { get; set; }
    }
}

楽しい :)


1
MSQueueスレッドセーフ?同じMSQueueを使用する複数のEXEアプリ?GetAllMessagesとPurgueについてはどうですか?
キケネット

@ Kiquenetquora.com / お役に立てれば幸いです
開発者
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.