编写MSMQ示例应用程序所需的最低要求


112

我已经进行了一个多小时的研究,并找到了许多有关如何在C#中使用MSMQ的示例,甚至是关于Message Queue的一本书的完整一章...但是要进行快速测试,我需要介绍的是这种情况,甚至没有以一种完美的方式进行快速演示:

“应用程序A”:将消息写入消息队列。(应用程序A是C#Windows服务)现在打开“应用程序B”(它是C#winForms应用程序),然后检查MSMQ,我看到哦,我有新消息。

就这样...我需要一个简单的演示。

有人可以帮我提供代码示例吗?非常感激。


14
拒绝投票的目的是什么?如果您对该主题有所了解,可以教我们其他人。
博恩2012年

4
@Sascha:阅读我的文章的开头:“我已经进行了一个多小时的研究,并找到了许多有关如何在C#中使用MSMQ的示例,甚至是关于Message Queue的一本书的完整一章...但是为了快速测试,我需要掩盖的是这种情况,甚至不是以一种完美的方式,只是为了进行快速演示”
Bohn 2012年


Answers:


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();

对于更复杂的情况,您可以使用Message对象发送消息,将您自己的类对象包装在其中,然后将您的类标记为可序列化。另外,请确保系统上已安装MSMQ


1
问题:在创建MessageQueue的顶部,我们都需要这两个吗?MessageQueue.Create(@“。\ Private $ \ SomeTestName”); messageQueue =新的MessageQueue(@“。\ Private $ \ SomeTestName”);
Bohn 2012年

3
是的,您需要两个声明,一个实际上创建了一个MSMQ,另一个仅初始化了带有路径的MSMQ
Anand 2012年

6
像魅力一样运作...希望您的愿望今天实现...您今天为我解决了一件大事。
Bohn 2012年

2
小错字:messageQueue = new MessageQueue(@“。\ Private $ \ SomeTestName”); System.Messaging.Message []消息= queue.GetAllMessages(); 应该是messageQueue = new MessageQueue(@“。\ Private $ \ SomeTestName”); System.Messaging.Message [] messages = messageQueue.GetAllMessages();
肯森

4
要将队列的输出打印到控制台,请在输出循环的正文中添加“ message.Formatter = new XmlMessageFormatter(new String [] {“ System.String,mscorlib”}); Console.Write(message.Body .ToString());“。当MSMQ将事物作为序列化对象传递时,您必须告诉它如何将接收到的对象反序列化为其原始形式。
Contango 2014年

16

也许下面的代码对于快速入门MSMQ的人很有用。

因此,我建议您在解决方案中创建3个应用程序:

  1. MessageTo(Windows窗体)添加1按钮。
  2. MessageFrom(Windows窗体)添加1 richtextbox。
  3. MyMessage(类库)添加1个类。

只需复制过去的代码并尝试即可。确保MS Windows上已安装MSMQ,项目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呢?
Kiquenet

@ Kiquenetquora.com/…我希望它能对您有所帮助
开发人员
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.