Мінімальний мінімум, необхідний для написання заявки на зразок MSMQ


112

Я займався дослідженнями більше години і знаходив чудові зразки використання MSMQ в C # і навіть одну повну главу книги про чергу повідомлень ... Але для швидкого тестування все, що мені потрібно, - це висвітлити цей сценарій, навіть не ідеально, просто для швидкої демонстрації:

"Додаток A": записує повідомлення до черги повідомлень. (Додаток A - це послуга Windows # C) Тепер я відкриваю "Application B" (це додаток C # winForms) і перевіряю MSMQ, і я бачу, що у мене є нове повідомлення.

Це все ... Все, що мені потрібно для простого демо.

Може хто-небудь, будь ласка, допомогти мені з зразком коду для цього? Цінується.


14
що за голос "проти"? Якщо ви знаєте щось про цю тему, добре навчіть решту нас.
Бон

4
@Sascha: прочитайте початок мого допису: "Я займався дослідженнями більше години і знаходив чудові зразки, як використовувати MSMQ в C # і навіть один повний розділ книги про чергу повідомлень ... Але для швидкого тестування всіх Мені потрібно, щоб висвітлити цей сценарій, навіть не ідеально, просто для швидкої демонстрації "
Бон

Випуск проблеми в MSMQ stackoverflow.com/questions/29225601/…
Jitendra Pancholi

Перевірте також цю статтю MSDN msdn.microsoft.com/en-us/library/…
Розробник

Відповіді:


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

Для більш складного сценарію ви можете використовувати об’єкти повідомлення для надсилання повідомлення, загортання власного об’єкта класу всередині нього та позначення свого класу як серіалізаційного. Також переконайтеся, що MSMQ встановлено у вашій системі


1
Запитання: вгорі, що ви створюєте Черговість повідомлень, нам потрібні обоє? MessageQueue.Create (@ ". \ Private $ \ SomeTestName"); messageQueue = нова MessageQueue (@ ". \ private $ \ SomeTestName");
Бон

3
Так, вам потрібні обидва твердження: один фактично створює MSMQ, а інший просто інтилізує MSMQ шляхом
Ананд,

6
працював як шарм ... Сподіваюся, одне з ваших побажань здійснилося сьогодні ... Ви вирішили для мене сьогодні велику справу.
Бон

2
Невелика помилка: messageQueue = нова MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = queue.GetAllMessages (); Повинна бути messageQueue = нове повідомленняQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = messageQueue.GetAllMessages ();
Kjensen

4
Щоб надрукувати вихід черги на консоль, в тілі вихідного циклу додайте "message.Formatter = новий XmlMessageFormatter (новий String [] {" System.String, mscorlib "}); Console.Write (message.Body .ToString ()); ". Коли MSMQ передає речі навколо як серіалізовані об'єкти, ви повинні сказати йому, як десеріалізувати отримані об'єкти у їх первісну форму.
Контанго

16

Можливо, код нижче буде корисним для когось, щоб отримати швидке вступ до MSMQ .

Тож для початку пропоную створити 3 програми в рішенні:

  1. MessageTo (Форма Windows) Додати 1 кнопку.
  2. Повідомлення від (Форма Windows) Додайте 1 багатетекстове поле.
  3. 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. Повідомлення від (Форма 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; }
    }
}

Насолоджуйтесь :)


1
MSQueue безпечний для потоків? Кілька програм EXE, що використовують один і той же MSQueue? Що про GetAllMessages та Purgue?
Кікенет

@Kiquenet quora.com/… Я сподіваюся, що це допоможе вам
Розробник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.