2012-06-18 28 views
98

我一直在研究一个多小时,并在C#中找到了有关如何使用MSMQ的很好的示例,甚至还有一本关于Message Queue的书的完整章节......但为了快速测试我所需要的一切就是覆盖这种情况,即使是以一种完美的方式,只是为了快速演示:编写MSMQ示例应用程序所需的最低限度

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

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

任何人都可以请帮我一个这样的代码示例吗?非常感激。

+13

什么是唐氏投票?如果你对这个话题有所了解,那么请教我们其他人。 – Bohn

+4

@Sascha:阅读我文章的开头部分:“我一直在研究一个多小时,找到了如何在C#中使用MSMQ,甚至是关于Message Queue的一本书的完整章节...但是对于快速测试我所需要的就是涵盖这种情况,甚至不是以完美的方式,只是为了快速演示“ – Bohn

+0

在MSMQ中获取问题http://stackoverflow.com/questions/29225601/getting-the-queue-does-not-存在或者你没有足够的权限到p –

回答

117
//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(@ “\私人$ \ SomeTestName。”); messageQueue = new MessageQueue(@“。\ Private $ \ SomeTestName”); – Bohn

+2

啊!我的错。让我纠正它 – Anand

+3

是的,你需要两个声明,一个实际上创建一个MSMQ,另一个只是初始化MSMQ,路径为 – Anand

10

下面的代码对于某人快速简介MSMQ也许是有用的。

因此,您必须在解决方案3应用程序中创建。

  1. MessageTo (Windows Form) Add 1 button.
  2. MessageFrom (Windows Form) Add 1 richtextbox.
  3. MyMessage (Class Library) Add 1 class.

只需复制过去的代码并尝试一下。请在您的MS Windows上安装MSMQ,并且项目1和项目2参考System.Messaging

1. MessageTo(Windows Form)添加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; } 
    } 
} 

享受:)

相关问题