web-dev-qa-db-fra.com

Le minimum nécessaire pour écrire un exemple d'application MSMQ

Je fais des recherches depuis plus d'une heure et je trouve d'excellents exemples d'utilisation de MSMQ en C # et même un chapitre complet d'un livre sur Message Queue ... Mais pour un test rapide, il ne me reste plus qu'à couvrir ce scénario, même de manière parfaite, juste pour une démo rapide:

"Application A": écrit un message dans Message Queue. (L'application A est un service Windows C #) Maintenant, j'ouvre l'application "B" (c'est une application C # WinForms) et je vérifie MSMQ et je vois que j'ai un nouveau message.

C'est ça ... Tout ce dont j'ai besoin pour une simple démo.

Quelqu'un pourrait-il m'aider s'il vous plaît avec un exemple de code pour cela? Très appréciée.

110
Bohn
//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();

Pour un scénario plus complexe, vous pouvez utiliser des objets Message pour envoyer le message, y insérer votre propre objet de classe et marquer votre classe comme sérialisable. Assurez-vous également que MSMQ est installé sur votre système.

131
Anand

Peut-être que le code ci-dessous sera utile pour que quelqu'un puisse faire une introduction rapide à MSMQ .

Donc, pour commencer, je vous suggère de créer 3 applications dans une solution:

  1. MessageTo (Windows Form) Ajouter 1 bouton.
  2. MessageFrom (Windows Form) Ajoutez 1 richtextbox.
  3. MyMessage (bibliothèque de classes) Ajouter 1 classe.

Il suffit de copier le code et l’essayer. Assurez-vous que MSMQ est installé sur votre MS Windows et que les projets 1 et 2 ont une référence à System.Messaging.

1. MessageTo (Windows Form) Ajouter 1 bouton.

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) Ajouter 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;
        }
    }
}

. MyMessage (bibliothèque de classes) Ajouter 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; }
    }
}

Prendre plaisir :)

13
Developer