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:

 

 

 

 

 

RabbitMQ primeros pasos con colas de mensajería

Las MQ (Message Queue) son sistemas de almacenamiento de mensajes donde juegan un papel principal los roles de:

  • Publishers o creadores de mensajes en la cola.
  • Workers o consumidores de mensajes.

Ambos trabajan sobre un sistema independiente donde encolan mensajes y se van consumiendo por uno o varios agentes.

Gracias a un sistema de mensajería independiente podemos asegurar de que estos no se pierdan al menos hasta que no se consuman, podemos decidir el momento de consumirlos a intervalos determinados.

RabbitMQ es uno de los sistemas más populares, es de código abierto y disponible para múltiples plataformas. Cambien ofrecen implementaciones de clientes para múltiples lenguajes de programación.

Lo primero es descargar el instalador para Windows de este enlace e instalarlo (se instala en C:\Program Files\RabbitMQ Server), Actualmente la versión es la 3.6.1 (probablemente necesitaras instalar el interprete de lenguaje de programación Erlang previamente).

Una vez instaladas ambas aplicaciones vamos a tratar de hacer un par de ejemplos basados en PHP.

El servidor RabbitMQ  se instala como servicio de Windows.

Ejemplo 1: Productor y consumidor en PHP

Este ejemplo esta tomado directamente de la Web oficial de Rabbit. Consiste en 2 scripts, un productor y un consumidor.

Para realizar el ejemplo es necesaria la API php-amqplib que instalamos con Composer (debemos descargar e instalar para Win32), Composer es un gestor de dependencias para paquetes de PHP.

Creamos un fichero composer.json con el siguiente contenido:

{
    "require": {
        "php-amqplib/php-amqplib": "2.5.*"
    }
}

Y ejecutamos composer install en la carpeta donde esta el fichero.

Envió de mensajes send.php

<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'hello');
echo " [x] Sent 'Hello World!'\n";
$channel->close();
$connection->close();
?>