Transformación de mensajes en SOA con OpenESB

2
11637

Transformación de mensajes en SOA con OpenESB

Indice

  1. Transformación de mensajes en SOA con OpenESB
    1. Introducción
    2. Ejemplo: transformación sintáctica de una misma entidad
    3. Implementación con XSLT Module de OpenESB
    4. Proceso de transformación con XSLT
    5. Desplegar y probar el proyecto en OpenESB
    6. Conclusión

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

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

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:

Modelo del servicio de transformacion de mensajes

Implementación con XSLT Module de OpenESB

Creamos en NetBeans un nuevo proyecto de la categoría SOA y de tipo XSLT Module:

XSLT Module en OpenESB
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
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
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 transformacion
Crear un descriptor para el servicio de transformación

Definimos el contenido del mensaje y los tipos:

Configuracion abstracta del descriptor
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
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:

Configuracion concreta del WSDL
Configuración concreta del WSDL

Al finalizar, dispondremos en el proyecto de todos los descriptores necesarios:

Proyecto con 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:

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 peticion-respuesta
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 operacion del webservice publico
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:

Operacion de transformacion definida en el WSDL
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:

Configuracion XSLT
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
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:

Proyecto JBI desplegado, modulos JBI XSLT engine y HTTP Binding iniciados
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 transformacion desplegado en el ESB
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
Mensaje SOAP request

El mensaje de respuesta obtenido corresponde con el esperado:

Mensaje SOAP response
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.

 

2 COMENTARIOS

  1. 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

  2. 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.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad