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

112

J'ai fait des recherches pendant plus d'une heure et j'ai trouvé 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, tout ce dont j'ai besoin est de couvrir ce scénario, pas même d'une 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 "Application B" (c'est une application C # winForms) et je vérifie MSMQ et je vois oh j'ai un nouveau message.

Voilà ... Tout ce dont j'ai besoin pour une simple démo.

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

Bohn
la source
14
à quoi sert le vote à la baisse? Si vous savez quelque chose sur le sujet, apprenez-nous au reste.
Bohn
4
@Sascha: lisez le début de mon article: "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 tout J'ai besoin de couvrir ce scénario, même pas de manière parfaite, juste pour une rapide démo "
Bohn
Obtention d'un problème dans MSMQ stackoverflow.com/questions/29225601/…
Jitendra Pancholi
Consultez également cet article MSDN msdn.microsoft.com/en-us/library/…
Développeur

Réponses:

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

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

Anand
la source
1
Question: en haut de la création de MessageQueue, nous avons besoin des deux? MessageQueue.Create (@ ". \ Private $ \ SomeTestName"); messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName");
Bohn
3
Oui, vous avez besoin des deux déclarations, l'une crée en fait un MSMQ et l'autre initialise simplement MSMQ avec le chemin
Anand
6
a fonctionné comme un charme ... J'espère qu'un de vos souhaits se réalise aujourd'hui ... Vous avez résolu un gros problème pour moi aujourd'hui.
Bohn
2
Petite faute de frappe: messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = queue.GetAllMessages (); Devrait être messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = messageQueue.GetAllMessages ();
Kjensen
4
Pour imprimer la sortie de la file d'attente sur la console, dans le corps de la boucle de sortie, ajoutez "message.Formatter = new XmlMessageFormatter (new String [] {" System.String, mscorlib "}); Console.Write (message.Body .ToString ()); ". Au fur et à mesure que MSMQ transmet des objets sous forme d'objets sérialisés, vous devez lui indiquer comment désérialiser les objets reçus dans leur forme d'origine.
Contango
16

Peut-être que le code ci-dessous sera utile pour quelqu'un qui souhaite simplement 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) Ajoutez 1 classe.

Copiez simplement le code passé et essayez-le. Assurez-vous que MSMQ est installé sur votre MS Windows et que les projets 1 et 2 font référence à System.Messaging.

1. MessageTo (Windows Form) Bouton Ajouter 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 (Windows Form) Ajoutez 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 (Bibliothèque de classes) Ajoutez 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 :)

Développeur
la source
1
MSQueue thread-safe? Plusieurs applications EXE utilisant le même MSQueue? Qu'en est-il de GetAllMessages et de Purgue?
Kiquenet le
@Kiquenet quora.com/ ... J'espère que cela vous aidera
Développeur le