Das absolute Minimum, das zum Schreiben einer MSMQ-Beispielanwendung erforderlich ist

112

Ich habe über eine Stunde lang recherchiert und großartige Beispiele für die Verwendung von MSMQ in C # und sogar ein vollständiges Kapitel eines Buches über Message Queue gefunden ... Aber für einen schnellen Test muss ich nur dieses Szenario behandeln, nicht einmal auf perfekte Weise, nur für eine kurze Demo:

"Anwendung A": Schreibt eine Nachricht in die Nachrichtenwarteschlange. (Anwendung A ist ein C # -Fensterdienst) Jetzt öffne ich "Anwendung B" (es ist eine C # winForms-App) und überprüfe MSMQ und sehe, dass ich eine neue Nachricht habe.

Das war's ... Alles was ich für eine einfache Demo brauche.

Könnte mir bitte jemand mit einem Codebeispiel dafür helfen? Sehr geschätzt.

Bohn
quelle
14
Wofür ist Down Vote? Wenn Sie etwas über das Thema wissen, unterrichten Sie den Rest von uns.
Bohn
4
@Sascha: Lesen Sie den Anfang meines Beitrags: "Ich habe über eine Stunde lang recherchiert und großartige Beispiele für die Verwendung von MSMQ in C # und sogar ein vollständiges Kapitel eines Buches über Message Queue gefunden ... Aber für einen kurzen Test alles Ich muss dieses Szenario behandeln, nicht einmal auf perfekte Weise, nur für eine schnelle Demo "
Bohn
Problem in MSMQ stackoverflow.com/questions/29225601/…
Jitendra Pancholi
Überprüfen Sie auch diesen MSDN-Artikel msdn.microsoft.com/en-us/library/…
Entwickler

Antworten:

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

In einem komplexeren Szenario können Sie Nachrichtenobjekte verwenden, um die Nachricht zu senden, Ihr eigenes Klassenobjekt darin zu verpacken und Ihre Klasse als serialisierbar zu markieren. Stellen Sie außerdem sicher, dass MSMQ auf Ihrem System installiert ist

Anand
quelle
1
Frage: Oben, wo Sie die MessageQueue erstellen, benötigen wir beide? MessageQueue.Create (@ ". \ Private $ \ SomeTestName"); messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName");
Bohn
3
Ja, Sie benötigen beide Anweisungen, eine erstellt tatsächlich eine MSMQ und die andere initialisiert MSMQ nur mit dem Pfad
Anand
6
hat wie ein Zauber funktioniert ... Hoffe, einer Ihrer Wünsche wird heute wahr ... Sie haben heute eine große Sache für mich gelöst.
Bohn
2
Kleiner Tippfehler: messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = queue.GetAllMessages (); Sollte messageQueue = new MessageQueue sein (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = messageQueue.GetAllMessages ();
Kjensen
4
Um die Ausgabe der Warteschlange an die Konsole zu drucken, fügen Sie im Hauptteil der Ausgabeschleife "message.Formatter = new XmlMessageFormatter (new String [] {" System.String, mscorlib "}); Console.Write (message.Body) hinzu .ToString ()); ". Da MSMQ Dinge als serialisierte Objekte weitergibt, müssen Sie angeben, wie die empfangenen Objekte in ihre ursprüngliche Form deserialisiert werden sollen.
Contango
16

Vielleicht ist der folgende Code für jemanden nützlich, der nur eine kurze Einführung in MSMQ erhält .

Zu Beginn schlage ich vor, dass Sie 3 Apps in einer Lösung erstellen:

  1. MessageTo (Windows Form) 1 Schaltfläche hinzufügen.
  2. MessageFrom (Windows Form) Fügen Sie 1 Richtextbox hinzu.
  3. MyMessage (Klassenbibliothek) Fügen Sie 1 Klasse hinzu.

Kopieren Sie einfach den letzten Code und probieren Sie ihn aus. Stellen Sie sicher, dass MSMQ auf Ihrem MS Windows installiert ist und auf die Projekte 1 und 2 verweisen System.Messaging.

1. MessageTo (Windows Form) Fügen Sie 1 Schaltfläche hinzu.

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) Fügen Sie 1 Richtextbox hinzu.

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 (Klassenbibliothek) Fügen Sie 1 Klasse hinzu.

using System;

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

        public DateTime BornPoint { get; set; }

        public string Text { get; set; }
    }
}

Genießen :)

Entwickler
quelle
1
MSQueue threadsicher? Mehrere EXE-Apps mit derselben MSQueue? Was ist mit GetAllMessages und Purgue?
Kiquenet
@Kiquenet quora.com/… Ich hoffe, es wird Ihnen helfen
Entwickler