Spring Web Service

Spring Framework tiene un soporte para poder invocar web services de forma muy simple.
A continuación vamos a ver un ejemplo concreto invocando a un Web Service de prueba.

Que es AOP?

La Programación Orientada a Aspectos (AOP, Aspect-Oriented Programming) es un paradigma de programación relativamente reciente cuya intención es permitir una adecuada modularización de las aplicaciones y posibilitar una mejor separación de conceptos. Gracias a AOP se pueden encapsular los diferentes conceptos que componen una aplicación en entidades bien definidas, eliminando las dependencias entre cada uno de los módulos. De esta forma se consigue razonar mejor sobre los conceptos, se elimina la dispersión del código y las implementaciones resultan más comprensibles, adaptables y reusables.

Pointcut

En AOP, un Pointcut es un conjunto de puntos en el flujo de ejecución de un programa. Cuando se llega a alguno de estos puntos (indicados por un Pointcut) se ejecutan las instrucciones de un Advice. De esta manera, es posible alterar el funcionamiento del flujo original, agregando nueva funcionalidad.

Spring Transaction

Spring Framework permite configurar transacciones en forma declarativa. De esta forma, la manipulación de transacciones queda establecida en archivos de configuración, sin generar ningún impacto en el código.

Message Driven Bean

Message Driven Beans (o MDB) son un tipo de EJB para integración con mensajería JMS (Java Message Service).
Los MDB son objetos distribuidos que se crean para manipular asincrónicamente los mensajes JMS. Es decir, realizan las operaciones que no requieren una respuesta inmediata.

Java Exceptions

Una excepción es una condición excepcional que cambia el flujo normal del programa. Cuando tal evento se produce en Java, una excepción es lanzada y la ejecución del programa se transfiere al código responsable de tratar a esta excepción. Este mecanismo para tratar excepciones ofrece varias ventajas. A través de él es posible aislar el código responsable del tratamiento de los errores en bloques separados, dejando el código principal más limpio. También puede tratar los errores similares con un solo bloque, eliminando el código duplicado.

Test Driven Development

Desarrollo guiado por pruebas, o Test Driven Development (TDD) es una práctica de programación que involucra otras dos prácticas: Escribir las pruebas primero (Test First Development) y Refactorización (Refactoring). Para escribir las pruebas generalmente se utiliza la Prueba Unitaria (unit test en inglés).

JUnit

JUnit es un framework de código abierto desarrollado especialmente para crear, ejecutar y hacer reportes de estado de conjuntos de Prueba Unitaria automatizadas hechos en lenguaje Java.
JUnit es uno de los frameworks más populares en Java para realizar pruebas unitarias y llevar un desarrollo utilizando la práctica deTest Driven Development.

Ejemplo De JMS

Haciendo tostadas

Vamos entonces a hacer que nuestras aplicaciones Dib y Gaz se comuniquen con una cola de mensajes. Lo que haremos a continuación será:
  • Crear una cola en WebLogic (la heladera para pegar los mensajes)
  • Crear una aplicación que publique mensajes en la cola (Dib)
  • Crear un EJB que consuma los mensajes de la cola (Gaz)

JMS

Java Messaging Service es un API de Java que permite interactuar con colas de mensajes.

Qué son las colas de mensajes

Supongamos que existen 2 aplicaciones, Dib y Gaz. Dib sabe comer, y Gaz sabe hacer tostadas.
Cuando Dib tiene hambre, necesita realizarle un pedido a Gaz ("hazme 3 tostadas"). Usualmente, cuando Dib se levanta por la mañana le pide a Gaz las tostadas, y espera hasta que estén listas. Y este es el comportamiento que usamos generalmente en nuestras aplicaciones: al invocar a otra aplicación nuestra, lo hacemos via un EJB, y esperamos una respuesta "en el momento" (sincrónica) de la operación.
Ahora bien, hace unas semanas que Gaz consiguió un trabajo, así que no está durante toda la mañana. Y Dib estudia de noche y vuelve tarde, cuando Gaz ya está durmiendo. ¿Cómo comunicar entonces a estas dos aplicaciones, si ambas pueden no estar online en el mismo momento?
La solución a esto sería que Dib dejara una "petición" en algún lado (¿un papelito en la heladera?), y Gaz lo leyera cuando tenga tiempo y pueda cocinar las tostadas para Dib.
Justamente, esta comunicación asincrónica es el principio de la cola de mensajes.

La cola de mensajes

Una cola de mensajes es un lugar común (la heladera) donde algunas aplicaciones publican mensajes, que son consumidos por otras. Existen así 4 componentes principales en un sistema de mensajería:
  • publicador, es decir, quien publica un Mensaje en una Cola
  • consumidor, quien consume Mensajes de una Cola
  • mensaje, que tiene algún formato que tanto publicador como consumidor conocen.
  • cola, que es el lugar donde publicadores y consumidores se conectan y comunican a través de mensajes.
Es importante destacar que es un sistema asíncrono: el publicador y el consumidor no necesitan estar disponibles a la vez, ya que la cola actúa de intermediario, guardando y distribuyendo los mensajes a medida que el consumidor pueda atenderlos.

El API de JMS

Tipos de destinos

En JMS existen dos tipos de destinos: Queue (colas) y Topic.

Queue

En las Queue, existen uno o varios publicadores, y un consumidor. Los publicadores van dejando sus mensajes en la cola, y son tomados en orden por el consumidor (y luego se van descartando). Si el consumidor no está disponible, la cola va guardando ("encolando") los mensajes, de manera que el consumidor pueda retomar su procesamiento cuando vuelva a estar online.

Topic

Los Topic siguen el modelo "publicador/subscriptor". Uno o varios consumidores se "suscriben" al Topic, y van recibendo los mensajes que se publican. Cuando se desconectan dejan de recibir esos mensajes, y los pierden.

Otros tipos de mensaje


En el ejemplo, utilizamos un objeto !TextMessage para enviar el mensaje, pero existen otros tipos de mensaje muy útiles. Uno en particular es !MapMessage, que permite al mensaje agregarle varios pares de "clave-valor" para luego recuperarlos. Además, existe otro mensaje de tipo !ObjectMessage que permite enviar un objeto completo (serializable) dentro del mensaje..