提问人:Bohn 提问时间:6/18/2012 更新时间:2/12/2019 访问量:67098
编写 MSMQ 示例应用程序所需的最低限度
The bare minimum needed to write a MSMQ sample application
问:
我已经研究了一个多小时,并找到了如何在 C# 中使用 MSMQ 的好例子,甚至是一本关于 Message Queue 的书的一整章......但是对于快速测试,我需要的只是涵盖这个场景,甚至不是以完美的方式,只是为了快速演示:
“Application A”:向消息队列写入消息。(应用程序 A 是 C# Windows 服务) 现在我打开“应用程序 B”(它是一个 C# winForms 应用程序),然后检查 MSMQ,我看到哦,我有一条新消息。
就是这样。。。我只需要一个简单的演示。
谁能帮我提供代码示例?非常感谢。
答:
133赞
Anand
6/18/2012
#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
评论
1赞
Bohn
6/18/2012
问:在创建 MessageQueue 的顶部,我们需要这两个?MessageQueue.Create(@“.\Private$\SomeTestName”);messageQueue = 新 MessageQueue(@“.\Private$\SomeTestName”);
3赞
Anand
6/18/2012
是的,您需要这两个语句,一个实际上创建了 MSMQ,另一个只是使用路径初始化 MSMQ
6赞
Bohn
6/18/2012
像魅力一样工作......希望你的一个愿望今天成真......你今天为我解决了一件大事。
2赞
Kjensen
10/25/2013
小错别字: messageQueue = new MessageQueue(@“.\Private$\SomeTestName”);System.Messaging.Message[] 消息 = 队列。GetAllMessages();SHould be messageQueue = new MessageQueue(@“.\Private$\SomeTestName”);System.Messaging.Message[] 消息 = messageQueue.GetAllMessages();
4赞
Contango
1/23/2014
要将队列的输出打印到控制台,请在输出循环的正文中添加“message.格式化程序 = new XmlMessageFormatter(new String[] { “System.String,mscorlib” });Console.Write(消息。Body.ToString());”。当 MSMQ 将内容作为序列化对象传递时,您必须告诉它如何将其接收的对象反序列化为其原始形式。
16赞
NoWar
5/13/2016
#2
也许下面的代码对于快速了解 MSMQ 的人很有用。
因此,首先,我建议您在解决方案中创建 3 个应用程序:
- MessageTo(Windows 窗体) 添加 1 个按钮。
- MessageFrom(Windows 窗体) 添加 1 个 richtextbox。
- 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赞
Kiquenet
1/31/2020
MSQueue 线程安全 ?多个 EXE 应用程序使用相同的 MSQueue ?GetAllMessages 和 Purgue 怎么样?
0赞
NoWar
1/31/2020
@Kiquenet quora.com/......希望对您有所帮助
评论