Lo mínimo necesario para escribir una aplicación de muestra de MSMQ

112

He estado investigando durante más de una hora y encontré excelentes ejemplos de cómo usar MSMQ en C # e incluso un capítulo completo de un libro sobre Message Queue ... Pero para una prueba rápida, todo lo que necesito es cubrir este escenario, ni siquiera de una manera perfecta, solo para una demostración rápida:

"Aplicación A": escribe un mensaje en la cola de mensajes. (La aplicación A es un servicio de Windows de C #) Ahora abro la "Aplicación B" (es una aplicación de C # winForms) y reviso MSMQ y veo que tengo un mensaje nuevo.

Eso es todo ... Todo lo que necesito para una demostración simple.

¿Alguien podría ayudarme con una muestra de código para esto? Muy apreciado.

Bohn
fuente
14
¿Por qué es el voto negativo? Si sabes algo sobre el tema, está bien enséñanos al resto de nosotros.
Bohn
4
@Sascha: lea el comienzo de mi publicación: "He estado investigando durante más de una hora y encontré excelentes ejemplos de cómo usar MSMQ en C # e incluso un capítulo completo de un libro sobre Message Queue ... Pero para una prueba rápida, todos Lo que necesito es cubrir este escenario, ni siquiera de una manera perfecta, solo para una demostración rápida "
Bohn
Obteniendo un problema en MSMQ stackoverflow.com/questions/29225601/…
Jitendra Pancholi
Consulte también este artículo de MSDN msdn.microsoft.com/en-us/library/…
Desarrollador

Respuestas:

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

Para escenarios más complejos, puede usar objetos de mensaje para enviar el mensaje, envolver su propio objeto de clase dentro de él y marcar su clase como serializable. También asegúrese de que MSMQ esté instalado en su sistema

Anand
fuente
1
Pregunta: en la parte superior que está creando MessageQueue, ¿necesitamos ambos? MessageQueue.Create (@ ". \ Privado $ \ SomeTestName"); messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName");
Bohn
3
Sí, necesita ambas declaraciones, una en realidad crea un MSMQ y la otra simplemente inicializa MSMQ con la ruta
Anand
6
funcionó como un encanto ... Espero que uno de tus deseos se haga realidad hoy ... Resolviste un gran problema para mí hoy.
Bohn
2
Pequeño error tipográfico: messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] mensajes = queue.GetAllMessages (); Debería ser messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = messageQueue.GetAllMessages ();
Kjensen
4
Para imprimir la salida de la cola en la consola, en el cuerpo del bucle de salida, agregue "message.Formatter = new XmlMessageFormatter (new String [] {" System.String, mscorlib "}); Console.Write (message.Body .Encadenar());". A medida que MSMQ pasa cosas como objetos serializados, debe indicarle cómo deserializar los objetos recibidos en su forma original.
Contango
16

Quizás el siguiente código sea útil para que alguien obtenga una introducción rápida a MSMQ .

Entonces, para comenzar, sugiero que cree 3 aplicaciones en una solución:

  1. MessageTo (Windows Form) Botón Agregar 1.
  2. MessageFrom (Windows Form) Agregue 1 cuadro de texto enriquecido.
  3. MyMessage (Biblioteca de clases) Agregue 1 clase.

Simplemente copie el código anterior y pruébelo. Asegúrese de que MSMQ esté instalado en su MS Windows y que los proyectos 1 y 2 tengan referencia System.Messaging.

1. Botón Agregar 1 de 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) Agregue 1 cuadro de texto enriquecido.

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 (Biblioteca de clases) Agregue 1 clase.

using System;

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

        public DateTime BornPoint { get; set; }

        public string Text { get; set; }
    }
}

Disfruta :)

Desarrollador
fuente
1
MSQueue seguro para subprocesos? ¿Varias aplicaciones EXE que utilizan el mismo MSQueue? ¿Qué hay de GetAllMessages y Purgue?
Kiquenet
@Kiquenet quora.com/… Espero que te ayude
Desarrollador