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

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();
?>