C# BasicMSMQClient: Ejemplo básico de envío de mensaje a una cola MSMQ

Con el servicio MSMQ arrancado en el PC local Win7 (ver “MSMQ: Microsoft Message Queuing“) vamos a crear una aplicación C# mínima para publicar un mensaje en la cola “test_queue”.

Para  poder usar el espacio de nombres “System.Messaging” y sus clases una vez creado el proyecto debemos añadir la referencia en el explorador de soluciones (CTRL+ALT+L).

Después añadimos el espacio de  nombres “using System.Messaging;” que nos proporciona las clases necesarias para trabajar con MSMQ.

La única clase que vamos a necesitar para un ejemplo mínimo es MessageQueue. Esta clase nos permite acceder a una cola existente o incluso crearla. Al constructor de la case le pasamos una cadena con la ruta de la cola. Cuando una cola es privada como la del ejemplo esta no se pública en los servicios de AD (Active Directory),  una cola privada es para ser empleada solo en el ámbito del PC local (entre dos aplicaciones en el mismo servidor por ejemplo).

El método send manda un mensaje no transaccional con una etiqueta.

Aquí tenéis el ejemplo:

Cada vez que ejecutamos la aplicación un nuevo mensaje se almacena en la cola (gestionar las colas ejecutando con compmgmt.msc).

Podemos abrir cada mensaje para ver sus campos:

 

 

 

 

 

 

 

MSMQ: Microsoft Message Queuing

En algún otro post he hablado sobre brokers de mensajería como RabbitMQ o WSO2. Muchas de estas soluciones internamente usan JMS (Java Message Service).  Microsoft no podía ser menos y tiene su propia solución llamada MSMQ para sistemas operativos Windows Server. MSMQ permite la comunicación basada en colas de mensajería entre procesos o máquinas. Su funcionamiento hace especial hincapié en la confiabilidad y en la tolerancia a fallas mediante mecanismos que aseguren que el mensaje siempre llega al destinatario tarde o temprano (incluso en el caso de que la máquina destino este temporalemente fuera de servicio).

Es muy sencillo habilitar MSQM incluso en Win7:

Podemos administrar las colas ejecutando el siguiente comando compmgmt.msc:


Podemos crear una nueva cola privada haciendo clic con el botón derecho del ratón en la carpeta “Colas privadas”. 

También podemos comprobar si el servidor esta arrancado como un servicio de Windows (para arrancarlo en cualquier momento ejecutamos “NET START MSMQ”).

 

C# RabbitMQClient: Productor de mensajes básico (con WSO2) usando .NET/C# en VS2012

RabbitMQ es un broker de mensajería (ver entrada RabbitMQ primeros pasos con colas de mensajería). Vamos a tratar de usar el cliente para .NET en  un proyecto con MS Visual Studio 2012 para conectar a un broker de mensajería WSO2 (ver WSO2: Broker de mensajería IoT (WSO2 IoTS))

Para instalar el paquete RabbitMQ.Client en VS2012  es recomendable usar el gestor de paquetes incorporado NuGet (RabbitMQ.Client 4.1.3) ejecutando el siguiente comando:

PM> Install-Package RabbitMQ.Client -Version 4.1.3

Para instalar el paquete previamente hemos creado un nuevo proyecto C# para consola.

Importamos la librería con la línea


using RabbitMQ.Client;

La clase ConnectionFactory construye instancias de IConnection y permite configurar el nombre el host, el virtual host y las credenciales de acceso. En vez usar las propiedades  factory.UserName, factory.Password… Compactamos la cadena de conexión en una sola línea usando la propiedad URI.


ConnectionFactory factory = new ConnectionFactory();
factory.Uri = "amqp://admin:admin@localhost:5672/carbon";

WSO2 usa el puerto TCP 5672 como broker de mensajería con el protocolo AMQP, podemos cambiar en cualquier momento el puerto editando el fichero C:\wso2mb-3.1.0\repository\conf\broker.xml.


El último parámetro del URI es el VHost, en WSO2 podemos encontrar información del VHost en C:\wso2mb-3.1.0\repository\conf\advanced\qpid-virtualhosts.xml. El VHost por defecto se llama “carbon”. Dentro del fichero también encontramos información sobre el exchange y queue (“amq.direct" is the default exchange that should be used for queue creation.).


IConnection conn = factory.CreateConnection();

IModel channel = conn.CreateModel();
channel.ExchangeDeclare("amq.direct","direct",true);

Le pasamos la conexión a la instancia IConnection empleado para crear nuevos canales.  La llamada a CreateConnection produce una excepción si el servidor WSO2 está parado por ejemplo.

El interface IModel se usa para el modelo AMQP le pasamos tres parámetros al método ExchangeDeclare. 

  • exchangeName: Un productor nunca envía directamente los mensajes directamente a la cola, en su lugar los envía a un exchange.

 

  • type: Debe ser uno de los siguientes “direct” (los mensajes van sólo a la cola especificada en routingKey), “topic”, “headers” o “fanout” (broadcast a todas las colas).
  • El tercer parámetro “durable” a true mantiene la cola persistente en el servidor.

La última parte es publicar el mensaje usando el método BasicPublish.

 var message = GetMessage(args);
 var body = Encoding.UTF8.GetBytes(message);
 
 channel.BasicPublish(exchange: "amq.direct",
 routingKey: "test-queue",
 basicProperties: null,
 body: body);

 channel.Close();
 conn.Close();

Código completo

Crear la cola en “test-queue” en WSO2

En el servidor WSO2 creamos una cola llamada “test-queue” a media que ejecutemos nuestro cliente publicador irá aumentando el contador de mensajes.

 

Referencias

WSO2: Broker de mensajería IoT (WSO2 IoTS)

WSO2 es un servidor de mensajería para conectar dispositivos IoT (ver entrada RabbitMQ primeros pasos con colas de mensajería), funciona como muchos otros servidores sobre un motor JDK (JMS – Java Message Service) lo que lo convierte en una solución multiplataforma de facto.  Permite trabajar con la base de datos embebida con la aplicación, para entornos empresariales puede trabajar con los sistemas de gestión de bases de datos más populares como Oracle, MySQL, PostreSQL.

Sin entrar en detalles un broker funciona como un enrutador de mensajería, las aplicaciones que se comunican con el servidor de mensajería pueden jugar varios roles, como productor / publicador de mensajes en un topic (gestión de colas basadas en contenidos) determinado o como consumidores / subcriptores de mensajes (Publish–subscribe pattern). El nodo central puede recibir de múltiples origenes y enrutar el mensaje al canal correcto, incluso transformar el mensaje a una representación alternativa.

WSO2: Working with Topics

Es arquitectura favorece la escalabilidad y la incorporación de nuevos nodos. La dependencia mutua entre aplicaciones se minimiza (decoupling), los publicadores que envían mensajes no lo hacen directamente a un receptor especifico, no tienen porque saber si al otro lado hay una aplicación, varias o ninguna recibiendo esos mensajes.

Podemos descargar el servidor del siguiente enlace. En la Web de descarga también ofrecen la subscripción a la comunidad y hospedar nuestra infraestructura IoT en su nube (Beta y previo pago).

Protocolos soportados:

  • Advanced Message Queuing Protocol (AMQP)(0-91))
  • Message Queuing Telemetry Transport Protocol (MQTT) v 3.1.1.

WSO2 IoTS es Open Source. He descargado el servidor wso2mb-3.1.0.zip a mi PC con Win7Pro y lo he descomprimido desde el raíz C:\wso2mb-3.1.0\.

Estructura de carpetas principales:

  • README.txt: El primer fichero que hay leer siempre.
  • bin: Script para Shell Linux y DOS.
  • client-lib: librerías JMS.
  • dbscripts: Scripts SQL para MySQL, Oracle…
  • lib: Librerías necesarias para WSO2.
  • repository.
    • conf: Ficheros de configuración.
    • database.
    • logs: Ficheros de logs de la ejecución.
  • resources: Recursos adicionales.
  • tmp: Ficheros temporales.

Una vez descomprimido sólo debemos ejecutar el script \bin\wso2server.bat para arrancar el servidor.

Una vez que arranca podemos administrar el servidor usando la aplicación Web en la siguiente dirección: https://localhost:9443/carbon  (usuario “admin” y clave “admin” por defecto).

Referencias externas: