编写 MSMQ 示例应用程序所需的最低限度

Posted

技术标签:

【中文标题】编写 MSMQ 示例应用程序所需的最低限度【英文标题】:The bare minimum needed to write a MSMQ sample application 【发布时间】:2012-06-20 01:33:57 【问题描述】:

我已经研究了一个多小时,并找到了关于如何在 C# 中使用 MSMQ 的很好的示例,甚至是关于消息队列的一本书的一整章......但是为了快速测试,我只需要涵盖这个场景,甚至不是完美的方式,只是为了快速演示:

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

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

谁能帮我提供一个代码示例?非常感谢。

【问题讨论】:

什么是反对票?如果您对该主题有所了解,可以教我们其他人。 @Sascha:阅读我帖子的开头:“我已经研究了一个多小时,找到了如何在 C# 中使用 MSMQ 的优秀示例,甚至是关于消息队列的一本书的完整章节。 ..但是为了快速测试,我只需要涵盖这种情况,甚至不是完美的方式,只是为了快速演示” 在 MSMQ ***.com/questions/29225601/… 中遇到问题 查看这篇 MSDN 文章以及msdn.microsoft.com/en-us/library/… 【参考方案1】:
//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

【讨论】:

问题:在顶部,您正在创建消息队列,我们​​需要这两个? MessageQueue.Create(@".\Private$\SomeTestName"); messageQueue = new MessageQueue(@".\Private$\SomeTestName"); 是的,你需要两个语句,一个实际创建一个 MSMQ,另一个只是用路径初始化 MSMQ 工作就像一个魅力...希望今天你的一个愿望成真...你今天为我解决了一件大事。 小错字:messageQueue = new MessageQueue(@".\Private$\SomeTestName"); System.Messaging.Message[] 消息 = queue.GetAllMessages();应该是 messageQueue = new MessageQueue(@".\Private$\SomeTestName"); System.Messaging.Message[] 消息 = messageQueue.GetAllMessages(); 要将队列的输出打印到控制台,在输出循环的主体中,添加 "message.Formatter = new XmlMessageFormatter(new String[] "System.String,mscorlib" ) ;Console.Write(message.Body.ToString());"。由于 MSMQ 将事物作为序列化对象传递,因此您必须告诉它如何将接收到的对象反序列化为原始形式。【参考方案2】:

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

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

    MessageTo(Windows 窗体)添加 1 个按钮。 MessageFrom(Windows 窗体)添加 1 个富文本框。 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 个富文本框。

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; 
    

享受:)

【讨论】:

MSQueue 线程安全?使用同一个 MSQueue 的多个 EXE 应用程序? GetAllMessages 和 Purgue 怎么样? @Kiquenet quora.com/… 希望对你有帮助

以上是关于编写 MSMQ 示例应用程序所需的最低限度的主要内容,如果未能解决你的问题,请参考以下文章

R语言中编写最小工作示例(MWRE)

所需的最低 Cuda 能力为 3.5

运行我的小程序所需的最低 Java 版本

Smack 4.1 所需的最低 Android API 级别是多少?

您如何计算每月达到 100 次销售目标所需的最低销售额?

Mobile first server(版本 7.1)所需的 websphere 应用程序服务器(网络部署)的最低版本是多少?