2012-03-21 15 views
12

He escrito una aplicación de muestra para escribir en una cola pública y privada que está en el servidor de desarrollo. No tengo la cola de mensajes instalada en mi máquina local.MSMQ: la cola de mensajes no se ha instalado en esta computadora

Recibo un error: la cola de mensajes no se ha instalado en esta computadora.

error es en esta línea:

MessageQueue.Exists(queueName) 

Aquí está el código de prueba completa, todas las colas privadas y públicas comentadas y no comentado se han traducido en el mismo error. ¿Qué estoy haciendo mal aquí?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

using System.Messaging; 

namespace MsmqTest 
{ 
    public partial class Form1 : Form 
    { 
     //@"DIRECT=OS:devbox01\PRIVATE$\PrivateQueueDev"; 
     //@"DIRECT=TCP:192.168.6.102\PRIVATE$\PrivateQueueDev"; 
     private const string QueueName = @"DIRECT=TCP:192.168.6.102\PRIVATE$\PrivateQueueDev"; 


     //@"DIRECT=OS:devbox01\PublicQueueDev"; 
     //@"DIRECT=TCP:192.168.6.102\PublicQueueDev"; 
     private const string QueueNamePublic = @"DIRECT=TCP:192.168.6.102\PublicQueueDev"; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Write_Click(object sender, EventArgs e) 
     { 
      MessageQueue msgQ; 
      string msgText = String.Format("Message: {0}", DateTime.Now); 
      try 
      { 
       msgQ = GetQ(QueueNamePublic); 
       msgQ.Send(msgText); 
      } 
      catch (Exception ex) 
      { 
       throw new Exception(ex.Message); 
      } 
     } 

     private void Read_Click(object sender, EventArgs e) 
     { 

     } 

     private MessageQueue GetQ(string queueName) 
     { 
      MessageQueue msgQ; 

      if(!MessageQueue.Exists(queueName)) 
      { 
       try 
       { 
        msgQ = MessageQueue.Create(queueName); 
       } 
       catch (Exception ex) 
       { 
        throw new Exception("Error creating queue", ex); 
       } 
      } 
      else 
      { 
       try 
       { 
        msgQ = new MessageQueue(queueName); 
       } 
       catch (Exception ex) 
       { 
        throw new Exception("Error getting queue", ex); 
       } 
      } 
      return msgQ; 
     } 

    } 
} 

Respuesta

14

Debe instalar MSMQ en TODAS las máquinas que deseen participar en la transmisión y recepción de mensajes. Eso incluye enviar máquinas como su máquina local en esta instancia.

La razón de esto se debe al patrón de almacenamiento y reenvío de mensajes que usa MSMQ.

http://en.wikipedia.org/wiki/Store_and_forward

Lo que está sucediendo realmente cuando "enviar" un mensaje a su servidor es:

  1. El gestor de colas local escribe el mensaje a una cola temporal local.
  2. El gestor de colas local se conecta al gestor de colas remoto.
  3. El mensaje se transmite.
  4. El gestor de colas remoto escribe el mensaje en la cola remota.
+0

¿Cuáles son mis alternativas aquí? No quiero instalarlo en la máquina de los usuarios, entonces enviaré el mensaje. ¿Puedo usar WCF? ¿Podría indicarme algún código de muestra que pueda ayudarlo? –

+0

No hay alternativa si quiere usar MSMQ. No creo que habilitarlo en una máquina de usuarios deba ser un problema. Es parte de Windows. –

+0

Tenemos entre 15 y 20 usuarios que necesitarán esto habilitado. ¿Qué puedo usar en lugar de MSMQ? Básicamente, los clientes enviarán una identificación y luego Listner tendrá que realizar algunas tareas por esa identificación. Tiene que ser un proceso de estilo de cola, primero en entrar primero en salir. –

5

Refactorice la lógica de MSMQ a un servicio y llame al servicio desde su código, pasando el mensaje. De esa manera solo tienes que instalar MSMQ en el servidor.

+0

Buena idea; Voy con esto –

Cuestiones relacionadas