Procesador Inteligente de Eventos (IEP) con OpenESB
Indice
- Procesador Inteligente de Eventos (IEP) con OpenESB
Introducción
En la actualidad los sistemas empresariales se caracterizan por el manejo intensivo de información procedentes de sistemas internos y externos. La gestión de toda esa misma información ha de ser automatizada en lo posible con infraestructuras adecuadas. SOA tiene presente este aspecto, introduciendo lo que se conoce como la Gestión Compleja de Eventos, y que trata de procesar la información en base a eventos de negocio mediante la implantación de las soluciones IT adecuadas.
OpenESB ofrece esta gestión mediante el Procesador Inteligente de Eventos (IEP, Intelligent Event Processor), y en este tutorial vamos a conocer su funcionamiento de manera práctica. Los requisitos para realizar el ejemplo están descritos en el tutorial: OpenESB 2.1. Instalación e introducción al entorno.
Ejemplo: caso de uso de estadísticas de venta
Supongamos que una empresa quiere obtener en todo momento indicadores del estado de su negocio. En concreto le interesa controlar las ventas no rentables del último mes: aquellos productos cuyo importe es menor de 60 euros y han sido devueltos en las dos primeras semanas de garantía. Las partes de la empresa que generan los eventos son:
- Eventos de venta: venta online mediante página web
- Eventos de devolución: centro de atención al cliente
El código fuente del ejemplo desarrollado en NetBeans puede descargarse aquí: IEP-OpenESB-adictosaltrabajo.zip, y el proyecto de prueba con soapUI aquí: Prueba Procesador Eventos Ventas.zip
Implementación con IEP – Intelligent Event Processor de OpenESB
OpenESB permite, a través de su editor visual en NetBeans, modelar un diagrama para el manejo de los eventos. Una vez preparado, se despliega en GlassFish ESB y se pone en ejecución, volcando la información procesada en una base de datos que podemos consultar.
En NetBeans creamos un nuevo proyecto IEP desde File | New Project | SOA | Intelligent Event Processing Module:
Intelligent Event Processing Module de OpenESB
El nombre del proyecto será ProcesadorEventosVentas. Creamos un nuevo procesador, pulsando con el botón derecho sobre el nombre del proyecto | New | Intelligent Event Processor:
Creamos un procesador de eventos
y lo denominamos AnalisisVentasRentables. Veremos que se nos abre el editor IEP con una paleta de operadores que permitirán manipular los eventos: filtrar, agregar, componer, interseccionar, almacenar,etc. Su utilización dotará al procesador de la inteligencia que reza su nombre:
Paleta de operadores de eventos
Fase 1: entrada de eventos
Todo procesador tiene que tener al menos un punto de entrada de los eventos. De sección Input de la paleta arrastramos al editor dos operadores Stream Input, Hacemos doble click para editar cada uno de ellos. En el primero recogeremos los eventos de venta mediante página web:
Input de eventos de venta Online
El segundo servirá de entrada de eventos de devolución:
Entrada de los eventos de devolución
Fase 2: fitrar eventos
A continuación filtramos los eventos por ventanas de tiempo. Para ello arrastramos de la paleta dos operadores Stream Converter de tipo Time Based Window. Enlazamos cada Input con su filtro de tiempo, pulsando sobre la fecha de cada icono y arrastrándola al operador de tiempo:
Filtrado de eventos por ventanas de tiempo
Editamos el filtro asociado a EventosVentaOnline y cambiamos el nombre y el periodo de tiempo:
Eventos de venta en el ultimo mes
Y el filtro de devoluciones:
Devoluciones en periodo de garantía
Fase 3: correlación de eventos
Ahora tenemos que correlacionar los eventos que proceden de las ventas y reclamaciones, pues lo harán cada uno en un orden y frecuencia imprevisibles, que dependerá únicamente del mercado. Arrastramos un operador Relation Map de la categoría Correlation And Filter, y lo enlzamos con las ventanas de tiempo:
Correlamos los eventos de distinto origen
Editamos el operador RelationMap0. Las variables que aparecen en la sección SELECT y WHERE pueden introducirse fácilmente arrastrando su nombre desde el panel izquierdo y soltándolo en la zona de texto destino.
Correlación de eventos de distinto origen
Fase 4: almacenar resultados
Finalmente vamos a almacenar los resultados en base de datos (utilizaremos Java DB, que ya está con OpenESB y configurada con IEP). Introducimos en el editor un operador Table Output, de la categoría Output y enlazamos el de correlación:
Almacenamos los resultados procesados en base de datos
Editamos el operador enlazado a la correlación VentasNoRentables:
Tabla de base de datos de ventas no rentables
Guardamos los cambios en el editor. Compilamos todo pulsando con el botón derecho sobre el nombre del proyecto ProcesadorEventosVentas | Clean And Build. Se habrá generado un descriptor WSDL del procesador, como se aprecia en la imagen:
Estado final del proyecto IEP
Desplegar y probar el proyecto
Tal como se explica en otros tutoriales (e.g. Tutorial de BPEL con OpenESB (II)), para probar un módulo SOA de OpenESB es necesario que pertenezca a una aplicación compuesta de JBI. Para ello creamos en NetBeans un proyecto Composite Application desde el menú File | New Project | SOA | Composite Application, y le damos el nombre AplicacionIEPVentas. Sobre la carpeta JBI Modules pulsamos botón derecho | Add JBI Module y en la ventana emergente seleccionamos el proyecto ProcesadorEventosVentas y pulsamos en Add Project JAR Files. Finalmente compilamos el proyecto, pulsando con botón derecho sobre su nombre AplicacionIEPVentas | Clean and Build. El aspecto final será:
Composite Application de SOA para desplegar el IEP
Teniendo el servidor GlassFish V2 previamente arrancado, desplegamos el proyecto AplicacionIepVentas pulsando de nuevo botón derecho | Deploy. El proyecto se habrá desplegado en el contenedor JBI:
Procesador de eventos desplegado
En este momento los operadores de entrada que hemos editado antes (EventosVentaOnline y EventosDevolucionVenta) estarán expuestos como dos operaciones de un webservice, y podrán ser invocados como tales. Su WSDL se encuentra publicado en http://localhost:12100/service/AnalisisVentasRentables_iep?WSDL
Descriptor del servicio de invocación al procesador de eventos
La explicación es que el ESB de GlassFish ESB no intercepta los eventos para dárselos al procesador de eventos, sino que tenemos que invocar al procesador nosotros de manera explícita (hay alguna excepción con BPEL que sí implementa la API). La intercepción de eventos a través del enrutador de mensajes de JBI se introducirá en la versión de OpenESB v3 (Fuji). Hay una demo interesante al respecto en el siguiente screencast de Sun: Fuji Interceptors.
Para probar el procesador de eventos, creamos con soapUI una suite de pruebas funcionales (ejemplo de uso: Pruebas funcionales de servicios web con soapUI) que emita compras de cuatro clientes:
- Cliente 1: Adquiere un teléfono (45 €), una televisión (120 €), una lámpara (34€) y un libro (18 €), pero luego devuelve todo en garantía menos el libro.
- Cliente 2: Compra un libro (15 €) y un CD de música clásica (22 €). No devuelve nada
- Cliente 3: Compra 2 peliculas distintas en DVD, cada una de 30 € y una videoconsola (340 €). Devuelve una de las dos películas.
Ejemplo de compra del cliente 1 de un teléfono:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:anal="AnalisisVentasRentables_iep"
> <soapenv:Header/> <soapenv:Body> <anal:EventosVentaOnline_MsgObj> <producto>telefono
</producto> <ingreso>45
</ingreso> <idCliente>0001
</idCliente> <fechaVenta>2009-12-12
</fechaVenta> </anal:EventosVentaOnline_MsgObj> </soapenv:Body> </soapenv:Envelope>
Ejemplo de devolución del cliente 1 del telefono:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:anal="AnalisisVentasRentables_iep"
> <soapenv:Header/> <soapenv:Body> <anal:EventosDevolucionVenta_MsgObj> <producto>telefono
</producto> <idCliente>0001
</idCliente> <motivo>No hace juego con los muebles
</motivo> <fechaDevolucion>2009-12-20
</fechaDevolucion> </anal:EventosDevolucionVenta_MsgObj> </soapenv:Body> </soapenv:Envelope>
Ejecutamos los casos de prueba:
Juego de pruebas de compras y devoluciones ejecutadas
Análisis de los resultados
Desde la pestaña Services conectamos con el esquema de la base de datos de Java DB: iepseDB (IEP Service Engine DataBase). Para ello pulsamos con el botón derecho sobre Databases | New Connection:
Conexión a base de datos desde NetBeans
Completamos el siguiente diálogo (contraseña iepseDB):
Datos de conexión a la base de datos de iepseDB
Seleccionamos el esquema iepseDB
Explorando la nueva conexión vemos que existe la tabla VENTAS_NO_RENTABLES:
Tabla creada por el procesador de eventos
Y el contenido es el esperado; las ventas del teléfono, la lámpara y el DVD de Titanic no han sido rentables:
Se han procesado los eventos de manera correcta
Conclusión
En el tutorial hemos desarrollado un ejemplo sencillo pero que pretende ilustrar la lógica y mecanismos básicos en la gestión de eventos. Las empresas con un nivel de madurez elevado de SOA hacen un uso muy eficiente de la información de negocio que conllevan los eventos; de esta manera no sólo las decisiones de negocio sino también la propia infraestructura tecnológica son capaces de reconfigurarse conforme a determinadas políticas o lograr atender a demandas de mercado en menor tiempo.
Autentia colabora con importantes compañías aportando consultorías tecnológicas de calidad e impartiendo formación de SOA y arquitecturas empresariales. Si le interesa para su empresa, no dude en contactarnos: info@autentia.com
El OpenESB está realmente bien pero la verdad es que me preocupa bastante su futuro… ahora que es Oracle quien lleva la sartén por el mango y dado que ellos tienen un ESB de pago ¿que crees que pasará con el OpenESB v3? ¿verá la luz o no? (ya lleva casi dos meses de retraso sobre la fecha… y no hay movimiento en el planning del proyecto desde hace mas de un mes)… no pinta bien el tema… ¿tu que crees?