martes, 24 de diciembre de 2013

Extracción de mensajes de las colas del Azure Service Bus

En post anteriores hemos mostrado como sacar mensajes de un “queue” tanto desde Java como desde .NET. Sin embargo, el proceso de extracción de estos mensajes ha sido mediante un ciclo que constantemente trata de obtener los nuevos mensajes que residen en la cola seleccionada. Esto podría no ser ideal en ciertos escenarios en donde el flujo de mensajes no es constante o por ejemplo donde tenemos muchos mensajes pero queremos tener paralelismo a la hora de consumir los mensajes entrantes. Con el SDK 2.0 y superior Windows de Azure ahora tenemos la posibilidad de tener una forma alterna de consumir estos mensajes mediante notificación del evento de recibo por parte del Bus de Azure ( o Windows Service Bus ).

Extracción de mensajes con el método OnMessage

Este método nos permite asociar un método “callback” a la instancia de la cola creada el cual se va a ejecutar cada vez que un mensaje llega a la cola del bus.

Ejemplo

Para ilustrar el modelo de extracción de mensajes, vamos a trabajar en un ejemplo de envío y recibo de mensajes a través de una cola de mensajes en el bus. Como se puede ver en la siguiente figura, tenemos 6783 mensajes en el bus esperando a ser procesados. Para extraerlos no vamos a usar un ciclo de extracción, sino mas bien el método OnMessage.

image

Como se ilustra en el siguiente código, primero vamos a crear un método para configurar el callback al evento OnMessage. Primero creamos una instancia de la clase MessageOptions donde establecemos si queremos que el mensaje se marque como completo cuando se procesa y cuantas llamadas a la cola concurrentes pueden ser creadas. Luego establecemos el mecanismo para manejar las excepciones y por ultimo configuramos el método onMessage con el callback que viene de parámetro – que va a procesar cada mensaje que llega – y las opciones de recibo.

  public void GetMessagePump(Action<BrokeredMessage> pCallback)
        {
            var _messageOptions = new OnMessageOptions {AutoComplete = true, MaxConcurrentCalls = 5};
            _messageOptions.ExceptionReceived += _messageOptions_ExceptionReceived;
            GetQueueClient().OnMessage( pCallback, _messageOptions);
        }
        void _messageOptions_ExceptionReceived(object sender, ExceptionReceivedEventArgs e)
        {
            if (e != null && e.Exception != null)
            {
                Trace.WriteLine(">> Se presento la siguiente excepcion: {0}",
                    e.Exception.ToString());
            }
        }

Seguidamente procedemos a crear el método que va a manejar el mensaje y que viene de parámetro en el Callback del metodo GetMessagePump. Como se e ve en el código, el método recibe un mensaje del bus como parámetro y luego lo procesa. En este caso hacemos lo que necesitamos hacer con el mensaje, pero específicamente para este ejemplo vamos a loguear el recibo del mensaje en un TextBox de una aplicación Windows Forms – simplemente logueamos una propiedad de la clase BaseRecord la cual es un Guid.

 private void OnMessageArrived(BrokeredMessage pMessage)
        {
            if (pMessage != null)
            {
                txtEstadoProceso.Invoke((MethodInvoker) delegate
                {
BaseRecord _baseRecord = pMessage.GetBody<BaseRecord>();
                    txtEstadoProceso.Text +=
                        string.Format(
                            "Procesando registro {0} a las {1} \n" + Environment.NewLine,
                            _baseRecord.TransactionId.ToString(),
                            DateTime.Now.ToString());
                });

pMessage.Complete();

            }
        }

Por ultimo en el evento del botón obtener mensajes agregamos el siguiente código que activa la recepción de mensajes. En este caso en particular, los métodos anteriores – excepto el de OnMessageArrived – fueron escritos en una clase que encapsula la interacción con el bus de Azure llamada ServiceBusManager.

        private void btnRecibirPorNotificacion_Click(object sender, EventArgs e)
        {
            var _serviceBus = new ServiceBusManager();
            _serviceBus.GetMessagePump(OnMessageArrived);
        }

Si ejecutamos el código anterior podemos ver como se van extrayendo los mensajes vía el método OnMessage a través del Callback OnMessageArrived.


image


Como podemos en la imagen anterior, los registros se procesan de 5 en 5 ( así se configuro en el MessageOptions ) y todos tienen el Id de la transacción igual porque son mensajes correlacionados. Esta misma operación puede ser llevada a cabo en el Windows Service Bus.


Etiquetas de Technorati:

viernes, 6 de diciembre de 2013

Evento CloudDay Guayaquil

En este post quiero aprovechar para invitarlos a participar el próximo martes 10 de diciembre en el evento CloudDay Guayaquil en el cual estaré brindando 4 charlas. El evento esta orientado a la computación en la nube utilizando las plataformas Microsoft. Nuestra empresa – Arc3Labs – será patrocinador del mismo y yo estaré de expositor en el mismo con 4 charlas. Mis charlas serán orientadas al tema del middleware en la nube y dispositivos móviles

Las charlas que voy a dar son las siguientes:

  1. BizTalk Services: En esta charla les estaré presentando de que se trata BizTalk Services y como utilizar el Servidor BizTalk desde la nube.
  2. Incorporando dispositivos móviles al middleware de la empresa: En esta charla vamos a hablar de como crear aplicaciones que le aporten valor a la empresa, conectando a través del bus de Azure un dispositivo móvil a un sistema legacy. Para la demo utilizaremos MacOs, iOS, y Java.
  3. Middleware Híbridos: En esta demo vamos a ver como crear middleware híbridos utilizando Azure Service Bus y BizTalk Server. Esta combinación resulta sumamente interesante porque con poca inversión permite a las empresas tener una capa media con una capacidad transaccional altísimo y una escalabilidad casi indefinida.
  4. Gobernabilidad: Administración y monitoreo de aplicaciones de Windows Azure con System Center: En esta charla vamos a hablar del potencial de una herramienta como System Center, con la cual podemos monitorear no solo herramientas “on premises” si no también nuestro middleware en la nube ( con lo que los middleware híbridos pueden ser monitoreados de forma completa

Para los que estén por Guayaquil ese día, aquí les dejo el registro: http://www.thecloudday.com/Charlas.aspx#

Para los que no puedan llegar luego del evento voy a subir las presentaciones.

Etiquetas de Technorati: ,,,

lunes, 19 de agosto de 2013

Utilizando el Azure Service Bus con Java - Queues

Una de las ventajas del Azure Service Bus, es que nos permite utilizarlo no solo con código .NET si no también con código Java, python, javascript, etc. En este post vamos a acceder queues en el Azure Service Bus desde una aplicación java hecha en netbeans y corriendo en Mac OS.
En primera instancia vamos a asumir que el namespace y el queue a utilizar ya están configurados, si no lo están pueden visitar los post anteriores al respecto.

Configurar la conexion

Lo primero que debemos hacer es configurar en el código la información necesaria para poder conectarnos al bus. Para esto procedemos a descargar las librerías java para tal propósito (jars) las cuales podemos  obtener desde este link.
Seguidamente procedemos a agregar dichos jars como una librería a nuestra solución - en este caso una aplicación de consola.
 
image
Luego procedemos importando las librerías que necesitamos para que el código compile y funcione:
 
image
 
El siguiente paso es configurar la conexión vía código; esto es, crear el objeto con la configuración de la conexión al bus y crear la clase que mantendrá esta comunicación. Como podemos ver en el siguiente código, esto lo logramos utilizando la clase Configuración en donde pasamos como parámetro el namespace, el usuario, la llave, el url del bus y el tipo de control de acceso. Seguidamente procedemos a crear la clase para conectarnos al service bus a partir de esta configuración.
image

Enviando un mensaje

Una vez configurada la conexión al bus, procedemos a enviar el mensaje. Para esto, vamos a proceder creando el mensaje - Brokered message como en los post anteriores de .NET. Seguidamente agregamos una propiedad al mensaje ( llamada Propiedad) y por ultimo procedemos a enviar el mensaje. El código lo podemos ver en el siguiente listado.
image
Si enviamos el mensaje desde la aplicación de consola, podremos ver que el mensaje se envía correctamente.
image
Si vamos a la consola de Windows Azure, podremos ver que el mensaje esta en la cola esperando a ser consumido por algún cliente.
image

Recibir un mensaje

Para recibir un mensaje vamos a reutilizar el código para la configuración de la conexión utilizado anteriormente y vamos a proceder creando las opciones para recibir el mensaje, que para este caso será recibir el mensaje y borrarlo de la cola, esto lo vamos a lograr con la clase ReceiveMessageOptions. Luego procedemos a recibir el mensaje utilizando el método receiveQueueMessage desde la instancia de la clase ServiceBusContract y procedemos a manipular el mensaje recibido.  Para este ejemplo, simplemente vamos a imprimir el id del mensaje, el cuerpo del mensaje, y la propiedad personalizada llamada Propiedad que agregamos en el envío del mensaje. El código de este método se puede ver en el siguiente listado.
image
El resultado a la hora de ejecutar la aplicación se ve en la siguiente figura:
image
Si vamos de nuevo al portal de Azure, veremos que el largo del queue ya no es 1, si no 0 ya que procedimos con la extracción del mensaje.

image

miércoles, 27 de marzo de 2013

Windows Azure Service Bus - Queues

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.

image

Una vez instalado, procedemos a conectarnos al namespace del bus de Azure utilizando nuestro perfil de conexión – ya visto en post anteriores.

image

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:

image

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:


image


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.


image


image


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.


image


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.


image


Technorati Tags: ,

jueves, 7 de febrero de 2013

WebCast de Arquitectura

Los invito a participar en una serie de webcast que estaré brindando acerca del tema de arquitectura de software. En el mismo se van a estar tocando temas tales como:

  • ¿Qué es arquitectura?
  • ¿Que hace un arquitecto de software?
  • Arquitectura distribuida
  • Buses de Servicio
  • BPM
  • Seguridad
  • Gobernabilidad
  • Computación en la nube
  • Pruebas

y muchos temas más. El link de registro es el siguiente:

http://msdn.microsoft.com/es-ar/jj920131(es-ar) 

Etiquetas de Technorati:

sábado, 19 de enero de 2013

Windows Azure Service Bus {Primera Aplicación} - Parte 2

Ahora que ya tenemos configurado un namespace en nuestra cuenta de Windows Azure, procedemos a programar un ejemplo de como utilizar el Bus de Servicio de Windows Azure. Lo primero que vamos a hacer es hacer una simple aplicación de consola desde donde vamos a poder interactuar con el bus de Windows Azure.

Agregando las Referencias

Para iniciar, tenemos que agregar las referencias a las librerías requeridas para poder desarrollar contra el Bus de Servicios. Esto lo podemos hacer buscando las librerías correspondientes o utilizando el paquete de NuGet – el cual utilizaremos en este ejemplo.

image

En la pantalla de administración de paquetes procedemos a buscar el paquete el cual se llama WindowsAzure.ServiceBus. Cuando lo encontramos seleccionamos instalar.

image

En la instalación vamos a requerir que aceptemos la licencia del software y listo, el proceso inicia.

image

Cuando termina la instalación, vamos a ver las referencias al paquete agregada a nuestro proyecto.

image

Creando Entidades en el Bus de Servicios

Para poder hacer nuestro primero demo, vamos a crear una cola desde el Explorador de Servidores; para esto, le damos botón derecho a el ítem llamado Queues en nuestro namespace y seleccionamos “Create New Queue”.

image

Aquí nos aparece la pantalla desde donde podemos establecer todos los valores de la nueva Cola. En nuestro caso solo vamos a ponerle nombre “TestQueue1” y procedemos a guardarla.

image

 

 

 

 

 

 

 

 

 

 

 

 

 

Una vez creada la cola, la misma aparece listada en el server explorer – El mismo proceso lo podemos utilizar para crear Topics.

image

Listando las Colas en el Bus de Servicios

Ahora vamos a programar nuestro primer ejemplo. Vamos a listar las colas disponibles en nuestro bus de servicios. Primero que todo en la aplicación de consola procedemos a crear una instancia del NamespaceManager, el cual nos da todo el acceso al namespace en el bus de servicios. Como requiero conocer conocer los datos para conectarme al bus, voy a requerir el string de conexión del mismo. Este lo consigo si le doy botón derecho al namespace en el server explorer y selecciono propiedades. En las propiedades tengo acceso al string de conexión del bus de servicios y del respectivo namespace.

image 

Luego de esto procedemos a crear una constante con dicho valor – lo ideal es cambiar este connection string a un archivo de configuración, así podemos redireccionar el servicio a la nube o a una aplicacion on premises utilizando el mismo código pero con el Windows Service Bus en lugar del Windows Azure Service Bus.

const string connString = "Endpoint=sb://arc3labsdemocloud.servicebus.windows.net/;SharedSecretIssuer=owner;SharedSecretValue=IT4haj3NiSsZP/kGMTQDRiozTs49niEf9O8TzIZVg=";



Seguidamente agregamos el namespace del bus de servicios para tener acceso a la clase NamespaceManager.

using Microsoft.ServiceBus;



Ahora procedemos a crear el namespace, y luego de eso obtenemos las colas que existen en ese namespace.

var _namespaceManager = NamespaceManager.CreateFromConnectionString(connString);
var _listaDeColasDisponibles = _namespaceManager.GetQueues();




El siguiente paso es simplemente recorrer la colección y desplegar las colas que fueron encontradas en el namespace:

foreach (var _colaActual in _listaDeColasDisponibles)
{
Console.WriteLine(_colaActual.Path);
}



El resultado de la ejecución de este pequeño ejemplo es el siguiente:


image


Como podemos ver en la figura anterior, la cola llamada testqueue1 esta disponible.


Igualmente podemos crear una cola desde código utilizando la instrucción CreateQueue de la clase NamespaceManager.

_namespaceManager.CreateQueue("testQueue2");

Si agregamos la línea anterior antes de la instrucción para ejecutar las colas, el resultado de la ejecución nos muestra ahora dos colas en el namespace del bus de servicios.


image


Igualmente si refrescamos el server explorer podemos ver que existen ahora dos colas en el namespace.


image


Las colas se pueden crear con el método CreateQueueDescription, el cual nos permite agregar más parámetros para la creación de la cola. El mismo procedimiento aplica para los tópicos.





Etiquetas de Technorati: ,

Iniciando con el Bus de Servicios en Windows Azure – Parte 1

Esta es una serie de post dedicados a como desarrollar aplicaciones utilizando el Bus de Servicios de Windows Azure. El enfoque principal es ayudar a desarrolladores y arquitectos a explotar todas las bondades que nos ofrece el Windows Service Bus.

Alistando el ambiente para desarrollar

Para utilizar el bus de servicios en Windows Azure, debemos primero que todo instalar el SDK para desarrollo de Windows Azure. Para esto, vamos a visitar el sitio WindowsAzure.com y luego seleccionamos la opción desarrollo del menú principal; cuando estamos ahí escogemos .NET del menú secundario. En esta pantalla, seleccionamos instalar el SDK. Luego de eso nos aparece la siguiente pantalla.

image

Aquí seleccionamos la opción de acuerdo al Visual Studio que tengamos instalado. Al seleccionar esta opción, nos lleva directamente al Web Platform Installer – si no lo tenemos instalado lo instala y lo inicia. Ahí nos lleva a la pantalla del WPI donde nos indica que versión del SDK vamos a instalar.

image

Si exploramos los ítems que se van a instalar – link en la esquina inferior izquierda – vemos todo los componentes que se descargaran y luego se instalarán para que el SDK de desarrollo para Azure funcione.

image

Namespaces

Una vez finalizado procedemos el trabajo con el bus de Servicios procedemos a configurar el namespace donde van a ejecutarse nuestros servicios. Para entender la funcionalidad de los namespaces en el contexto del service bus de azure pueden visitar el post que escribí al respecto en el tema del Windows Service Bus, el cual tiene exactamente la misma funcionalidad que el Azure Service Bus.

Para proceder a crear el namespace ingresamos al sitio de Windows Azure – windowsazure.com – y nos logueamos. Ahi seleccionamos el portal de administración y nos vamos a la sección de Service Bus. Aqui procedemos a crear un nuevo espacio de nombres.

image

Cuando le damos agregar un nuevo namespace nos aparece un diálogo en donde tenemos que indicar el nombre que le vamos a poner – el cual debe de ser único – y la región en donde queremos funcione el namespace – más acerca de las regiones en otro post posterior.

image

Una vez creado el namespace veremos que esta listo para usarse en la pantalla de bus de servicios.

image

Podemos conectarnos al namespace usando el service bus Explorer o el Visual Studio. El service bus explorer fue utilizado en nuestro post acerca de namespaces en el Windows Service Bus, por lo tanto en esta ocasión vamos a utilizar Visual Studio. Para esto nos vamos al Server Explorer y procedemos a seleccionar la opción Windows Azure Service Bus.

image

Aquí dándole botón derecho, seleccionamos agregar nueva conexión. En esta pantalla tenemos la opción de agregar el perfil de suscripción de Azure o agregar las credenciales de forma manual. La segunda opción es útil sobre todo para hacer la conectividad al Windows Service Bus.

image

Sin embargo, para conectarse a Azure lo mejor es descargar la configuración de publicación – publish settings – y cargarlo desde ahí.

image

Para esto, le damos click al link “Download Publish Settings” y descargamos nuestro perfil.

image

Ya en la página Web procedemos a descargar el archivo de perfil – extensión publishsettings y lo guardamos en nuestra máquina, posteriormente procedemos a cargarlo desde la opción import del Subscription.

image

Una vez cargado, veremos que toda la información necesaria para conectarse al bus está disponible.

image

Si le damos click al botón ok, vamos a ver la conexión del bus disponible, desde donde podremos ver nuestras colas y tópicos disponibles.

image

Etiquetas de Technorati: