Como vimos en posts anteriores el Azure Service Bus ( y su homologo en Windows Server ) manejan dos esquemas de comunicacion: Queues y Topics. En este post vamos a ver un ejemplo para hacer funcionar los Queues en el Azure Service Bus.
Las colas tienen muchas ventajas a la hora de implementar sistemas y arquitecturas distribuidas, principalmente porque soportan un flujo muy alto de transacciones y porque son muy tolerante a los fallos, ya que si el consumidor del mensaje no esta disponible, el mensaje se persiste en la cola hasta que el consumidor este de vuelta de nuevo, o hasta que dicho mensaje expire.
Conectarse al Service Bus
Inicialmente, necesitamos conectarnos al bus de Azure en el namespace que hemos creado con anticipación en el post anterior. Para esto, necesitamos instalar en nuestra maquina de desarrollo el SDK para desarrollo de Windows Azure. Para esto, vamos a Visual Studio en donde seleccionamos “Manage NuGet Packages” y en la ventana de búsqueda digitamos Service Bus.
Una vez instalado, procedemos a conectarnos al namespace del bus de Azure utilizando nuestro perfil de conexión – ya visto en post anteriores.
Desarrollar el Demo
Ahora procedemos a crear un ejemplo, en donde vamos a tener una rutina que envía un mensaje a la cola llamada “testqueue1” – que fue creada en nuestro post anterior – y luego otra rutina que recibe ese mensaje desde la cola de Windows Azure. Para esto procedemos a crear un proyecto del tipo Windows Forms y dibujamos la pantalla de la siguiente forma:
En el primer cuadro, vamos a poder escribir un mensaje y enviarlo al bus. Este mensaje se va a quedar en la cola hasta que lo retiremos de la misma. Para esto, vamos a tener otro cuadro con un botón que va a ir sacar el mensaje de la cola del bus, y lo va a presentar en el TextBox de Mensaje Respuesta.
Poniendo el Mensaje en la Cola en el bus de servicios
Para poner el mensaje en la cola en el service bus en Windows Azure vamos a utilizar el siguiente código:
1: private void btnEnviar_Click(object pSender, EventArgs pE)
2: {
3: Cursor = Cursors.WaitCursor;
4: var _queueClient = QueueClient.Create("testqueue1", ReceiveMode.PeekLock);
5: _queueClient.Send(new BrokeredMessage
6: {
7: Properties = {{"Mensaje", txtMensaje.Text}}
8: });
9: Cursor = Cursors.Default;
10: }
En este código creamos una instancia de un cliente para acceder a la cola y apuntamos a la cola deseada a través del nombre en el factory de queues – QueueClient.Create. Seguidamente enviamos un mensaje ( muy simple por cierto ) y procedemos a olvidarnos del mismo.
Recibiendo el mensaje desde la cola del bus de servicios
Una vez puesto el mensaje en la cola, procedemos a obtener el mensaje directamente desde el bus de Windows Azure. Para esto, vamos a utilizar el siguiente código:
1: private void btnRecibir_Click(object pSender, EventArgs pE)
2: {
3: Cursor = Cursors.WaitCursor;
4: var _queueClient = QueueClient.Create("testqueue1", ReceiveMode.PeekLock);
5: var _mensaje = _queueClient.Receive();
6: txtRecibir.Text = (string) _mensaje.Properties["Mensaje"];
7: _mensaje.Complete();
8: Cursor = Cursors.Default;
9: }
En este caso, vamos a crear de nuevo un cliente para acceder la cola, luego recibimos el mensaje y obtenemos la propiedad “Mensaje” de la colección de propiedades del mismo. Por ultimo, marcamos el mensaje como completo para que sea removido de la cola.
Ejecutar el programa
Primero procedemos a ejecutar la aplicación y de inmediato enviamos un mensaje:
Para estar seguros de que el mensaje llego al bus, procedemos a detener la aplicación, y buscamos en el namespace la cola con la que estamos interactuando; si vemos sus propiedades, podemos ver que tiene un mensaje activo.
Para recibir el mensaje, procedemos a ejecutar el programa de nuevo y ejecutamos el botón recibir. El mensaje que estaba en la cola ahora se presenta en el text box destinado para la respuesta.
Si revisamos de nuevo las propiedades de la cola, podemos ver que en la propiedad ActiveMessageCount ahora el valor es 0, esto porque la obtención del mensaje, produce su eliminación de la cola del bus de servicios.