Il minimo indispensabile per scrivere un'applicazione di esempio MSMQ


112

Ho fatto ricerche per oltre un'ora e ho trovato ottimi esempi di come utilizzare MSMQ in C # e persino un intero capitolo di un libro sulla coda dei messaggi ... Ma per un test rapido tutto ciò di cui ho bisogno è coprire questo scenario, nemmeno in modo perfetto, solo per una rapida demo:

"Applicazione A": scrive un messaggio nella coda dei messaggi. (L'applicazione A è un servizio Windows C #) Ora apro "Applicazione B" (è un'app winForms C #) e controllo MSMQ e vedo che ho un nuovo messaggio.

Questo è tutto ... Tutto quello che mi serve per una semplice demo.

Qualcuno potrebbe aiutarmi con un esempio di codice per questo? Molto apprezzato.


14
a cosa serve il voto negativo? Se sai qualcosa sull'argomento, ok insegnaci a tutti.
Bohn

4
@Sascha: leggi l'inizio del mio post: "Ho fatto ricerche per oltre un'ora e ho trovato ottimi esempi di come utilizzare MSMQ in C # e persino un intero capitolo di un libro sulla coda dei messaggi ... Ma per un rapido test tutto Ho bisogno di coprire questo scenario, nemmeno in modo perfetto, solo per una rapida demo "
Bohn


Controlla anche questo articolo MSDN msdn.microsoft.com/en-us/library/…
Sviluppatore

Risposte:


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

Per scenari più complessi, è possibile utilizzare oggetti Message per inviare il messaggio, racchiudere il proprio oggetto di classe al suo interno e contrassegnare la classe come serializzabile. Assicurati anche che MSMQ sia installato sul tuo sistema


1
Domanda: nella parte superiore che stai creando la MessageQueue, abbiamo bisogno di entrambi? MessageQueue.Create (@ "\ Private $ \ SomeTestName."); messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName");
Bohn

3
Sì, hai bisogno di entrambe le affermazioni, una crea effettivamente un MSMQ e l'altro avvia solo MSMQ con il percorso
Anand

6
ha funzionato come un incantesimo ... Spero che uno dei tuoi desideri si avveri oggi ... Hai risolto una cosa importante per me oggi.
Bohn

2
Piccolo errore di battitura: messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = queue.GetAllMessages (); Dovrebbe essere messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = messageQueue.GetAllMessages ();
Kjensen

4
Per stampare l'output della coda sulla console, nel corpo del ciclo di output, aggiungi "message.Formatter = new XmlMessageFormatter (new String [] {" System.String, mscorlib "}); Console.Write (message.Body .Accordare());". Poiché MSMQ trasmette le cose come oggetti serializzati, devi dirgli come deserializzare gli oggetti ricevuti nella loro forma originale.
Contango

16

Forse il codice seguente sarà utile per qualcuno per ottenere una rapida introduzione a MSMQ .

Quindi per iniziare ti suggerisco di creare 3 app in una soluzione:

  1. MessageTo (Windows Form) Aggiungi 1 pulsante.
  2. MessageFrom (Windows Form) Aggiungi 1 richtextbox.
  3. MyMessage (Libreria di classi) Aggiungi 1 classe.

Copia il codice precedente e provalo. Assicurati che MSMQ sia installato su MS Windows e che i progetti 1 e 2 facciano riferimento a System.Messaging.

1. Pulsante Aggiungi 1 MessageTo (Windows Form).

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) Aggiungere 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 (Libreria di classi) Aggiungere 1 classe.

using System;

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

        public DateTime BornPoint { get; set; }

        public string Text { get; set; }
    }
}

Godere :)


1
MSQueue thread-safe? Più app EXE che utilizzano lo stesso MSQueue? Che dire di GetAllMessages e Purgue?
Kiquenet

@Kiquenet quora.com/… Spero che ti possa aiutare
Sviluppatore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.