Absolutne minimum potrzebne do napisania przykładowej aplikacji usługi MSMQ


112

Szukałem przez ponad godzinę i znajdowałem świetne przykłady korzystania z MSMQ w C #, a nawet jeden pełny rozdział książki o kolejce wiadomości ... Ale do szybkiego testu potrzebuję tylko omówić ten scenariusz, nawet nie w doskonały sposób, tylko do szybkiego demo:

„Aplikacja A”: zapisuje wiadomość w kolejce wiadomości. (Aplikacja A jest usługą systemu Windows w języku C #) Teraz otwieram „Aplikację B” (jest to aplikacja C # winForms) i sprawdzam usługę MSMQ i widzę, że mam nową wiadomość.

To wszystko ... Wszystko, czego potrzebuję do prostego demo.

Czy ktoś mógłby mi pomóc z przykładowym kodem? Bardzo cenione.


14
na co jest głos w dół? Jeśli wiesz coś na ten temat, ok, naucz resztę z nas.
Bohn

4
@Sascha: przeczytaj początek mojego posta: „Od ponad godziny prowadzę badania i znajduję świetne przykłady korzystania z usługi MSMQ w języku C #, a nawet jeden pełny rozdział książki o kolejce wiadomości… Ale do szybkiego przetestowania wszystkich Muszę opisać ten scenariusz, nawet nie w doskonały sposób, tylko po to, żeby obejrzeć szybką demonstrację ”
Bohn

Pojawienie się problemu w stackoverflow
MSMQ.com/questions/29225601/ ...

Przeczytaj również ten artykuł MSDN msdn.microsoft.com/en-us/library/ ...
Deweloper

Odpowiedzi:


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

W przypadku bardziej złożonego scenariusza można użyć obiektów Message, aby wysłać wiadomość, zawinąć w nią własny obiekt klasy i oznaczyć klasę jako możliwą do serializacji. Upewnij się również, że usługa MSMQ jest zainstalowana w systemie


1
Pytanie: na górze, że tworzysz MessageQueue, potrzebujemy obu? MessageQueue.Create (@ ". \ Private $ \ SomeTestName"); messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName");
Bohn

3
Tak, potrzebujesz obu oświadczeń, jedno faktycznie tworzy MSMQ, a drugie po prostu inicjuje MSMQ ze ścieżką
Anand

6
zadziałało jak urok ... Mam nadzieję, że jedno z Twoich życzeń się dzisiaj spełni ... Rozwiązałeś dziś dla mnie wielką sprawę.
Bohn

2
Mała literówka: messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = queue.GetAllMessages (); Powinna to być messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = messageQueue.GetAllMessages ();
Kjensen

4
Aby wydrukować dane wyjściowe kolejki na konsoli, w treści pętli wyjściowej dodaj „message.Formatter = new XmlMessageFormatter (new String [] {" System.String, mscorlib "}); Console.Write (message.Body .ToString ()); ". Ponieważ usługa MSMQ przekazuje rzeczy jako obiekty serializowane, musisz powiedzieć mu, jak deserializować otrzymane obiekty do ich oryginalnej postaci.
Contango,

16

Być może poniższy kod przyda się komuś, kto po prostu szybko wprowadzi do usługi MSMQ .

Na początek proponuję utworzyć 3 aplikacje w rozwiązaniu:

  1. Przycisk MessageTo (formularz Windows) Dodaj 1.
  2. MessageFrom (Windows Form) Dodaj 1 richtextbox.
  3. MyMessage (Class Library) Dodaj 1 klasę.

Po prostu skopiuj poprzedni kod i wypróbuj. Upewnij się, że usługa MSMQ jest zainstalowana w systemie MS Windows, a projekty 1 i 2 mają odniesienia do System.Messaging.

1. Przycisk MessageTo (Windows Form) Add 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 (formularz Windows) Dodaj 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) Dodaj 1 klasę.

using System;

namespace MyMessage
{
    [Serializable]
    public sealed class MyMessage
    {
        public TimeSpan LifeInterval { get; set; }

        public DateTime BornPoint { get; set; }

        public string Text { get; set; }
    }
}

Cieszyć się :)


1
MSQueue jest bezpieczny wątkowo? Wiele aplikacji EXE używających tego samego MSQueue? Co z GetAllMessages i Purgue?
Kiquenet

@Kiquenet quora.com/… Mam nadzieję, że to pomoże
programista
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.