2011-06-10 16 views
20

Bien, aquí hay una pregunta muy simple y fundamental. Si tengo una aplicación en la máquina A de Windows que desea escribir en una cola en la máquina B de Windows, ¿necesito tener MSMQ instalado en la máquina A (aunque no haya cola allí)? Estoy empezando a utilizar colas para mis aplicaciones y tratando de descifrar algunos fundamentos.Escribiendo a un MSMQ remoto

Gracias

Respuesta

34

Sí, se necesitan MSMQ instalado localmente para escribir en una cola remota. Si está escribiendo en una cola privada, eche un vistazo al this page que tiene información útil sobre cómo formatear el nombre de la cola. Si va a escribir a una cola transaccional remota, entonces usted necesita para asegurarse de que especifica que correctamente (punto 5)

Este es el texto del artículo:

1. Cuando se trabaja con las colas remotas, la nombre de la cola en el formato machinename\private$\queuename no funciona. Esto produce un error de "ruta de cola no válida" de .

2. El nombre de la cola debe mencionarse como FormatName:Direct=OS:machinename\\private$\\queuename.

Esto es necesario ya que el acceso a la cola se realiza internamente utilizando el formato sintaxis de nombre solamente. La otra representación amigable se convierte a FormatName y luego se usa. Al trabajar con colas remotas, a menos que haya un AD para resolver el nombre de la cola, el nombre descriptivo no funcionará en . Consulte la documentación para más detalles.

Por ej.

MessageQueue rmQ = new MessageQueue 
       ("FormatName:Direct=OS:machinename\\private$\\queue"); 
rmQ.Send("sent to regular queue - Atul"); 

3. Además del punto anterior, tenga en cuenta que FormatName distingue entre mayúsculas y minúsculas. Si menciona la cadena anterior como FORMATNAME:Direct=OS:machinename\\private$\\queuename, no funcionará . Sorprendentemente, no hay error lanzado en este caso. "FormatName" parte de la cadena parece ser la única parte sensible a mayúsculas de . Otros pueden aparecer en diferentes casos. Por ej. Puede escribir "DIRECTO".

4. En caso de que desee utilizar la dirección IP de la máquina, la sintaxis será FormatName:Direct=TCP:ipaddress\\private$\\queuename.

Por ej.

MessageQueue rmQ = new MessageQueue 
       ("FormatName:Direct=TCP:121.0.0.1\\private$\\queue"); 
rmQ.Send("sent to regular queue - Atul"); 

5. Las propiedades transaccionales de la instancia de cola se crea en el código debe coincidir con el de la cola que está intentando enviar el mensaje a . Entonces, en los ejemplos anteriores, estaba enviando un mensaje a una cola no transaccional . Para enviar a una cola transaccional, el código habría

MessageQueue rmTxnQ = new MessageQueue 
      ("FormatName:Direct=OS:machinename\\private$\\queue"); 
rmTxnQ.Send("sent to Txn queue - Atul", MessageQueueTransactionType.Single); 

Si las propiedades transaccionales no coinciden, el mensaje no será entregado . La parte sorprendente es, de nuevo, no he recibido ningún error, y el mensaje simplemente desapareció

6. Finalmente, cuando envía mensajes a la cola remota, se crea una cola de salida temporal en su propia máquina. Esto se usa en el caso la cola remota no está disponible. Si va a la consola de administración de la computadora (compmgmt.msc) y expanda los Servicios y aplicaciones/ Cola de mensajes/Colas salientes, verá estas colas. El lado derecho de la consola debe mostrar los detalles, incluido el estado (conectado o no) y las direcciones IP para el próximo salto (s).

+0

sí, eso es lo que pensé . Solo quería escucharlo de otra persona. Estoy usando colas privadas (ya he hecho la parte del formato). ¡UN PUNTO PARA GRYFFINDOR! –

+0

Después de realizar cambios según la configuración anterior (derechos y instalación de MSMQ): queue.send(): funciona bien. Pero oue queue.receive() o queue.getMessageEnumerator2() no funciona. ¿¿Me puede ayudar?? Estoy probando esto en mi máquina local (componentes instalados de MSMQ). – watraplion

+0

@watraplion debe hacer una nueva pregunta. – stuartd

1

Otro (en lugar de instalar MSMQ en la máquina local que ejecuta el cliente) sería implementar un servicio WCF que toma sus mensajes de una cola de MSMQ. En ese caso, su cliente remoto solo tendría que especificar el punto final del servicio remoto para que escriba directamente en la cola remota. También debería tener cuidado de que la seguridad en la cola remota se haya configurado correctamente.

Creo que esta sería una mejor manera de implementar la comunicación basada en cola. Esta es una respuesta corta, pero con gusto ampliaré si está interesado (me di cuenta de que estaba muy contento con la otra respuesta :)

+0

¿Estás hablando de WCF? –

+0

Sí. ¿Es eso un problema? – Rendition

+0

No, solo quería una aclaración. Su servicio WCF propuesto no está utilizando la integración de MSMQ, ¿o sí? Simplemente pasa a consumir mensajes MSMQ. –

6

Todas las comunicaciones MSMQ requieren un administrador de colas MSMQ en cada extremo. Las aplicaciones que usan MSMQ se comunican con su gestor de colas local, que hace el trabajo por ellas. Las aplicaciones que usan MSMQ no pueden comunicarse directamente con ninguna cola, local o remota.

0

debajo del formato trabajado para nosotros

key="PublicQueueName" value="FormatName:Direct=TCP:192.168.12.58\private$\myqueue" 

También se requeriría para dar permisos de acceso cola remota

seguridad: Permitir Anonymus entrada

enter image description here