Минимальный минимум, необходимый для написания примера приложения MSMQ
Я занимаюсь исследованиями более часа и нахожу отличные образцы того, как использовать MSMQ на С# и даже одну полную главу книги о очереди сообщений... Но для быстрого теста все, что мне нужно, это охватить этот сценарий, даже не в идеальном виде, просто для быстрой демонстрации:
"Приложение A": записывает сообщение в очередь сообщений. (Приложение A является службой Windows С#)
Теперь я открываю "Приложение B" (это приложение для winForms на С#), и я проверяю MSMQ, и вижу, что у меня появилось новое сообщение.
Что это... Все, что мне нужно для простой демонстрации.
Может ли кто-нибудь помочь мне с примером кода для этого? Очень ценится.
Ответы
Ответ 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 установлен в вашей системе
Ответ 2
Возможно, код ниже будет полезен для того, чтобы кто-то просто быстро ввел MSMQ.
Итак, вам нужно создать в приложении 3 приложения.
- Кнопка MessageTo (Windows Form) Добавить 1.
- MessageFrom (Windows Form) Добавить 1 richtextbox.
- MyMessage (Class Library) Добавьте 1 класс.
Просто скопируйте код и попробуйте его. Сделайте suer, чтобы MSMQ был установлен на вашей MS Windows, а proyects 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 Form) Добавить 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 (Class Library) Добавьте 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; }
}
}
Наслаждайтесь:)