2012-06-18 18 views
98

He estado investigando durante más de una hora y he encontrado excelentes muestras de cómo usar MSMQ en C# e incluso un capítulo completo de un libro sobre Message Queue ... Pero para una rápida probar todo lo que necesito es cubrir este escenario, ni siquiera de manera perfecta, solo para una demostración rápida:El mínimo necesario para escribir una aplicación de muestra MSMQ

"Aplicación A": Escribe un mensaje para Message Queue. (La aplicación A es un servicio de Windows C#) Ahora abro la "Aplicación B" (es una aplicación winForms de C#) y consulto MSMQ y veo que tengo un nuevo mensaje.

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

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

+13

lo que se ha reducido votar? Si sabes algo sobre el tema, Ok enséñanos a los demás. – Bohn

+4

@Sascha: lea el comienzo de mi publicación: "He estado investigando durante más de una hora y encontré excelentes muestras 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 lo único que necesito es cubrir este escenario, ni siquiera de manera perfecta, solo para una demostración rápida " – Bohn

+0

Obteniendo problemas en MSMQ http://stackoverflow.com/questions/29225601/getting-the-queue-does-not- existe-o-usted-no-tiene-suficientes-permisos-a-p –

Respuesta

117
//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 el escenario más complejo, se puede usar objetos de mensajes para enviar el mensaje, envuelva su propia clase de objeto en su interior, y marcar su clase como serializable. También asegúrese de que MSMQ esté instalado en su sistema

+1

Pregunta: en la parte superior que está creando el MessageQueue, necesitamos ambos? MessageQueue.Create (@ ". \ Private $ \ SomeTestName"); messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); – Bohn

+2

¡Ah! mi error.Déjame corregirlo – Anand

+3

Sí, necesitas tanto el enunciado, uno realmente crea un MSMQ y el otro solo inicia MSMQ con el camino – Anand

10

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

Así que debe crear en la solución 3 aplicaciones.

  1. MessageTo (Windows Form) Add 1 button.
  2. MessageFrom (Windows Form) Add 1 richtextbox.
  3. MyMessage (Class Library) Add 1 class.

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

1. MessageTo (Windows Form) Agregue 1 botón.

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) Añadir 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. MiMensaje (biblioteca de clases) Añadir 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; } 
    } 
} 

Enjoy :)

Cuestiones relacionadas