Transformación de mensajes en SOA con OpenESB
Indice
- Transformación de mensajes en SOA con OpenESB
Introducción
En este tutorial vamos a mostrar con un ejemplo práctico una de las capacidades esenciales de todo sistema de integración, y por tanto característica del Enterprise Service Bus de SOA: la tranformación de mensajes.
Los mensajes que viajan entre distintas partes de una infraestructura pueden ser tranformados y manipulados durante su enrutamiento para adaptarse a las necesidades lógicas y físicas de la misma. Así, y en arquitecturas orientadas a servicios, a un mensaje se le pueden aplicar mecanismos (estándar o propietarios) de seguridad, direccionamiento, composición, filtrado, etc., y transformación, que es nuestro caso. Partiremos del entorno descrito en el tutorial: OpenESB 2.1. Instalación e introducción al entorno y se recomienda tener conocimientos de OpenESB, definición de WSDL, XML Schema y XSLT.
El código fuente del tutorial y el proyecto de prueba soapUI están disponibles aquí: xsltmodule_adictosaltrabajo.com.zip
Ejemplo: transformación sintáctica de una misma entidad
En el ejemplo que vamos a desarrollar utilizaremos dos representaciones de una misma entidad de un pedido. Cada pedido tiene asociado una persona de contacto y unas especificaciones de material solicitado. Una representación se corresponde con las unidades de medida y nombres de familia de un país como España:
- Pedido
- Contacto del proveedor:
- Nombre y apellidos – tipo cadena
- Teléfono de contacto – tipo cadena
- Material de construcción
- Identificador – tipo cadena
- Peso máximo en kilogramos – tipo decimal, unidades de peso: kilogramos
- Contacto del proveedor:
Esta estructura la definimos en un fichero de XML Schema pedidoSchema.xsd:
La otra representación se corresponde con un país anglosajón. La entidad se define de la siguiente forma:
- Order:
- Supplier:
- First name – tipo cadena
- Last name – tipo cadena
- Phone number – tipo cadena
- Building material
- Identificador – tipo cadena
- Maximum weight – tipo decimal, unidades de peso: libras
- Supplier:
Esta estructura la definimos en orderSchema.xsd:
Nuestro servicio realizará la tranformación necesaria para representar la información del pedido en la estructura anglosajona partiendo de la española. Un esquema representativo de la operación puede ser:
Implementación con XSLT Module de OpenESB
Creamos en NetBeans un nuevo proyecto de la categoría SOA y de tipo XSLT Module:
Proyecto de tipo XSLT Module en OpenESB
ponemos como nombre de proyecto TransformacionPedido y Target Namespace: http://tutorial.adictosaltrabajo.com/transformmap/TransformacionPedido y creamos a continuación una subcarpeta de Transformation Files que llamaremos Descriptores:
Proyecto inicial de XSLT Module en NetBeans
En la carpeta descriptores creamos los ficheros pedidoSchema.xsd y orderSchema.xsd con el contenido mostrado en el apartado anterior:
Tipos definidos con XML Schema
De esta manera ya tenemos la definición de los tipos de entrada y salida del servicio de transformación de mensajes, de manera que la conversión podrá describirse en un fichero XSLT. Este módulo de tranformación de mensajes lo desplegaremos en el ESB, y será accesible de una manera estandarizada al igual que cualquier otro servicio; esto es, deberá disponer de un descriptor WSDL que contenga los detalles del servicio para poder vincularnos al mismo. Así pues, nuestro siguiente paso es crear en NetBeans el descriptor mediante el asistente del WSDL Document, en la misma carpeta de Descriptores, con las siguientes propiedades:
Crear un descriptor para el servicio de transformación
Definimos el contenido del mensaje y los tipos:
Configuracion abstracta del descriptor
Para la elección de los tipos pedido y order de la imagen anterior, debemos escogerlos bajo el nodo Elements del explorador de tipos:
Seleccion de los elementos pedido y order
En caso de no hacerlo y seleccionarlos bajo el nodo de Complex Types, no estaremos respetando la regla R2204 del WS-I (ya que hemos definido el tipo del descriptor como Document-Literal) y el asistente no nos permitirá continuar (más información en el tutorial Patrones de diseño de XML Schema).
Por último definimos la sección concreta del WSDL:
Configuración concreta del WSDL
Al finalizar, dispondremos en el proyecto de todos los descriptores necesarios:
Proyecto con los descriptores necesarios
Proceso de transformación con XSLT
En este punto ya podemos implementar la lógica de tranformación. Puesto que vamos a transformar mensajes XML, usaremos XSLT.
Pulsamos con el botón derecho sobre el nombre de proyecto TransformacionPedido | New | Other | SOA | XSLT Service:
Creamos un servicio de transformación con XSLT
El tipo de servicio de transformación será petición-respuesta (la otra opción corresponde a un message broker de tipo proxy):
Servicio XSLT petición-respuesta
A continuación definimos cómo se aplica la transformación. Introducimos como nombre del web service que publicaremos: transformarPedidoService y la operación la definida en el descriptoe del proyecto, transformacionPedidoOperation:
Nombre y operación del web service público
Como podemos observar, la operación corresponde a la que hemos definido en WSDL del proyecto:
Operación de transformación definida en el WSDL
En el siguiente paso de configuración XSLT cambiamos el nombre del fichero XSLT por XslTransformacion:
Configuración XSLT
En el proyecto se ha creado el fichero XslTransformacion.xsl, cuyo código de conversión para nuestro propósito debe ser el siguiente:
Con esto ya hemos terminado el proyecto, vamos a probarlo.
Desplegar y probar el proyecto en OpenESB
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 AplicacionTransformacion. Sobre la carpeta JBI Modules pulsamos botón derecho | Add JBI Module y en la ventana emergente seleccionamos el proyecto TransformacionPedido y pulsamos en Add Project JAR Files. Finalmente compilamos el proyecto, pulsando con botón derecho sobre su nombre AplicacionTransformacion | Clean and Build. El aspecto final será:
Composite Application de SOA para desplegar el XSL Module
Teniendo el servidor GlassFish V2 previamente arrancado, desplegamos el proyecto AplicacionTransformacion pulsando de nuevo botón derecho | Deploy. El proyecto se habrá desplegado en el contenedor JBI:
Estructura de módulos JBI
En este momento la operación del proxy de transformación estará expuesto como una operación habitual de webservice, y podrá ser invocados como tales. Su WSDL se encuentra publicado en http://localhost:9080/trasformacionPedidoService/trasformacionPedidoPort?WSDL
Descriptor del servicio de transformación desplegado en el ESB
Vamos a invocar al servicio web utilizando, por ejemplo, soapUI (tutorial de uso en SoapUI: jugando con web services). El SOAP request será:
Mensaje SOAP request
El mensaje de respuesta obtenido corresponde con el esperado:
Mensaje SOAP response
El mensaje ha sido transformado en tiempo de ejecución correctamente.
Conclusión
La heterogeneidad habitual en los sistemas que componen la infraestructura de una empresa que implementa SOA requieren soluciones que permitan salvar las diferencias entre la representación de la infromación. La ejecución de procesos en los que intervienen aplicaciones legacy requieren habitualmente una adaptación de los mensajes, al menos hasta un estado más avanzado de integración. Pero lo realmente importante es que los usuarios de negocio tienen que poder trabajar con una visión única de las entidades que manejan, y progresivamente los sistemas tienen que adecuarse para tener una sola representación, mediante normalización sintáctica o uso de estándares.
Para todo ello, la industria ofrece una amplia variedad de soluciones tecnológicas, y en este tutorial hemos probado la que OpenESB nos ofrece.
IVAN BUEN DIA, TENGO U INCONVENIENTE CON UN WEBSERVICE Q ESTOY CREANDO ES BASICO PERO ME FALTA.
en html con ayuda de un botón llame los datos de la base de datos consumiendo el servicio web.
donde te puedo enviar el archivo a ver si me puedes colaborar
grcaias por tu pronta ayuda
Hola Ivan,
He visto tu articulo y es lo que necesitaba, pero necesito hacerte una pregunta que, si eres tan amable de contestar, te estaría agradecido toda mi vida.
Te cuento, soy Consultor-Analista SAP, me dedico a generar procesos en SAP y en estos momentos he generado varios WebServices en SAP los cuales he probado con «soapUI 4.6.0» y desde aquí funcionan de maravilla.
El problema viene en que ahora necesito generar una PHP para que utilizando el WSDL que SAP me ha generado en la Publicación de mi WebService pueda conectarse con SAP.
He leído tu articulo, que vuelvo a decir está estupendo, pero a la hora de crear la página PHP, no he sido capaz, y después de casi 3 horas de frustación, me he decido a enviarte este email.
Si pudieras darme algún ejemplo de como tengo que poner en PHP las cosas para que funcionen te estaría eternamente agradecido.
Mi email es : martin_josep@outlook.es
Si puedes responderme en este email te lo agradecería mucho.
Gracias por todo y perdona las molestias.