Tutorial de BPEL con OpenESB (I)

6
52113

Tutorial de BPEL con OpenESB (I)

Indice

  1. Tutorial de BPEL con OpenESB (I)
    1. Introducción
    2. El proceso de negocio
    3. Identificar los servicios web requeridos
    4. Modelar el proceso de negocio con BPEL

      1. Generar el descriptor del proceso BPEL
      2. Importar descriptores WSDL de los servicios involucrados
      3. Diseñar el proceso BPEL gráficamente
  2. Tutorial de BPEL con OpenESB (II)
    1. Desplegar el módulo BPEL en el ESB
    2. Probar el proceso de compra
    3. Conclusión

Introducción

En este tutorial vamos a aprender a crear procesos BPEL practicando con un ejemplo: un proceso de negocio de venta online de libros. La empresa TuLibroOnline decidió adoptar SOA para sus infraestructuras IT y acualmente se encuentra en la fase de composición de servicios. Así pues, le llega el turno al proceso de venta de libros y se decide implementarlo con un proceso BPEL orquestando servicios web de las áreas implicadas en el negocio.

Para desarrollar el ejemplo es necesario tener instalado OpenESB 2.1 tal como se muestra en el tutorial OpenESB 2.1. Instalación e introducción al entorno, y tener unos conocimientos básicos de NetBeans y GlassFish. El código fuente puede descargarse aquí: BPEL-openESB_adictosaltrabajo.zip y el proyecto de pruebas de soapUI aquí: BPEL-openESB_adictosaltrabajo.zip.

Hemos dividido el tutorial en dos partes debido a su envergadura. La segunda parte del tutorial se encuentra en Tutorial de BPEL con OpenESB (II).

El proceso de negocio

Antes de programar nada, tenemos que comprender muy bien el proceso de negocio que pretendemos implementar con alguna tecnología. Para ello nos reunimos nuevamente con un responsable de negocio del área de ventas y tras comentarle los avances de la implantación tecnológica y lo que le permite ya hacer a la empresa, le pedimos valide el proceso de venta de libros. Finalmente se alcanza la propuesta:

Proceso de negocio de venta de libros
Proceso de negocio de venta de libros

Los detalles del proceso son los siguientes:

  • La orden de venta de inicia aportando el ID de cliente registrado que realiza la compra, el ISBN del libro que adquiere, el número de unidades y el precio por unidad.
  • Se comprueba en almacén que haya stock suficiente para el pedido. En su defecto el proceso finaliza y lo notifica, para así ofrecer alternativas al cliente y no perder la oportunidad de venta.
  • Si hay unidades suficientes, hemos de invocar al sistema de pago online que tenemos contratado con nuestra enidad financiera. La entidad ya dispone de los datos de los clientes registrados, por lo que se encarga de hacer las tramitaciones necesarias y asegurar el pago.
  • Finalmente emitimos la orden de envío a una empresa de mensajería. Facilitaremos un identificador de pedido para que lo recoja en almacén y lo reparta.
  • El resultado del proceso será una confirmación de la venta realizada.

Identificar los servicios web requeridos

Como siguiente paso tenemos que identificar los servicios web que realizan las funcionalidades concretas de cada paso del proceso. En nuestro caso son:

  • Servicio web del almacén:
    • comprobarStock, que espera el ISBN del libro y las unidades de compra, y responde si existe o no stock suficiente
  • Servicio web del sistema de pago online:
    • facturar, con un idCliente y una cuantía. Devuelve un código de factura
  • Servicio web de la empresa de mensajería:
    • enviarProducto, con nuestro identificador de la empresa y el pedido a servir. Nos responde con el tiempo en días estimado de reparto.

Estos servicios están implementados en los proyectos MensajeriaExpress, PagoOnline y TiendaElectronica del código fuente del tutorial. Deben ser abiertos como proyectos de NetBeans (menú File | Open Project):

Servicios Web del proceso de negocio en NetBeans
Servicios Web del proceso de negocio en NetBeans

Modelar el proceso de negocio con BPEL

Creamos un nuevo proyecto BPEL en NetBeans: File | New Project | SOA | BPEL Module:

Crear un Modulo BPEL en NetBeans
Crear un Módulo BPEL en OpenESB

Le asignamos el nombre ServiciosVenta. Sobre la estructura inicial del proyecto creamos las carpetas: DescriptorBPEL, ServicioAlmacen, ServicioPago, ServicioMensajeria (botón derecho sobre Process Files | New | Other | Other | Folder e introducimos el nombre en el campo Folder Name):

Estructura inicial del proyecto BPEL
Estructura inicial del módulo BPEL

Generar el descriptor del proceso BPEL

Un proceso BPEL se expone al resto como si de un servicio web se tratara. Por ello debe tener su propio descriptor WSDL. Lo creamos (botón derecho sobre DescriptorBPEL | New | WSDL Document) e introducimos los valores de la imagen:

Crear descriptor del proceso BPEL
Crear descriptor WSDL del proceso BPEL

En el siguiente paso del asistente introducimos los siguientes valores:

Definicion de una operacion del servicio y argumentos
Definición de la operación del servicio y sus argumentos

En el último paso aceptamos los valores propuestos:

Configuracion concreta del descriptor
Configuración concreta del descriptor

Finalizamos el asistente y ya tenemos definida la interfaz del proceso BPEL.

Importar descriptores WSDL de los servicios involucrados

Las aplicaciones web que hemos importado en NetBeans deberán estar desplegadas sobre el servidor GlassFish previamente arrancado. Así, podemos acceder a los contratos de los web services en las URL:

  • http://localhost:8080/MensajeriaExpress/EnvioPaquetesService?WSDL
  • http://localhost:8080/PagoOnline/PasarelaPagoService?WSDL
  • http://localhost:8080/TiendaElectronica/AlmacenService?WSDL

Todo proceso BPEL necesitará los contratos WSDL de los servicios que utilice, para poder invocarlos. Para importar los WSDL, hacemos botón derecho sobre la carpeta ServicioAlmacen | New | Other | XML | External WSDL Document(s) e introducimos la URL del descriptor del servicio de almacen:

Importamos los WSDL de los servicios utilizados
Importamos los WSDL de los servicios utilizados

Repetimos la operación con las carpetas ServicioPago, ServicioMensajeria y sus correspondientes descriptores. El proyecto quedará por tanto:

WSDL importados de los webservices utilizados
Importamos los descriptores de los webservices utilizados

Cabe decir que si disponemos los WDSL en disco en vez de resolverlos de la web, también pueden ser importados de manera similar. Incluso tendríamos una estructura de carpetas más limpia que la generada por NetBeans.

Diseñar el proceso BPEL gráficamente

Ahora viene lo más divertido ;-). Hacemos doble click sobre serviciosVenta.bpel y accedemos al editor visual. Es intuitivo y se basa en arrastrar y soltar elementos en las zonas permitidas. En primer lugar insertamos el descriptor del proceso BPEL a la izquierda del diagrama:

Insertar WSDL del BPEL
Insertar la interfaz WSDL del proceso BPEL

Pulsando sobre la representación del WSDL recién introducido y en su icono , accedemos a las popiedades. Cambiamos el nombre por defecto PartnerLink1 por VentaLibros y aceptamos. De igual manera introducimos los descriptores de los webservices utilizados, pero esta vez a la derecha del diagrama, como proveedores de servicios. Al arrastrar y soltar, aparecerá el diálogo de creación de un nuevo enlace a un proveedor de servicio (en el cual aprovecharemos para cambiar el nombre PartnerLink1 por el del servicio que corresponda, e.g. ServicioAlmacen):

Crear enlace a servicio proveedor
Crear enlace a servicio proveedor

El proceso quedará de la forma:

Aspecto inicial del BPEL
BPEL con los servicios proveedores (PartnerLinks)

A continuación utilizamos la paleta de actividades del editor BPEL de NetBeans:

Paleta de actividades del editor de BPEL
Paleta de actividades del editor de BPEL

y componemos en unos minutos un proceso como el de la imagen siguiente (para cambiar los nombres de las actividades utilizamos su icono de edición ):

Actividades del proceso
BPEL inicial con sus actividades

Comenzamos asociando las actividades de recepción, invocación y respuesta a los servicios. Hacemos doble click sobre la actividad de recepción e introducimos los valores que muestra la siguiente imagen. Para obtener la propiedad Input Variable, pulsamos sobre el botón Create… y aceptamos los valores por defecto, pues son significativos:

Actividad de recepcion BPEL
Editando la actividad de recepción

Tras aceptar, vemos en el BPEL que ha aparecido una flecha que une VentaLibros con la actividad de recepción. De igual manera hacemos con las actividades de respuesta. Editamos la última respuesta del proceso, RespuestaOk:

Actividad de respuesta de BPEL
Editando la actividad de respuesta

Hacemos lo mismo con la actividad de respuesta contenida dentro de la estructura de decisión (RespuestaNoOk):

Actvidad de respuesta de BPEL
Editando la respuesta de falta de Stock

A continuación hacemos lo mismo para cada actividad de invocación. Comenzando por ComprobarStock:

Invocacion del servicio de stock
Invocación del servicio de stock

Repetimos la operación para el resto de invocaciones, y el proceso BPEL habrá tomado una forma más reconocible::

BPEL con invocaciones resueltas
BPEL con las invocaciones a los servicios

A continuación editamos las variables de asignación. Como su nombre indica, cada una asigna variables a la actividad que le sigue. Por ejemplo, a la actividad de invocación AsignarStock espera unos valores de entrada (los del web service al que invoca). Estos valores los tenemos que asignar de la actividad que los tenga, en este caso la de recepción. Para ello pulsamos doble click sobre la actividad AsigStock y se abre el siguiente mapeador de valores, al que hemos asociado relaciones entre partes de mensajes, pulsando en el nombre de variable origen y arrastrando la fecha hasta el destino:

Asignacion de valores entre variables
Asignación de valores entre partes de mensajes

A la izquierda hemos filtrado por valores de salida (Output) y a la derecha por variables receptoras (Input). En este caso estamos asignando los valores de la actividad de recepción (cuyo nombre de variable ‘VentaLibrosWSDLOperationIn’ fue definido en un paso anterior), a la variable de entrada de la invocación al web service de comprobacion de Stock (ComprobarStockIn).

Para salir del mapeador y regresar el diagrama BPEL, hay que pulsar sobre la palabra Design en la parte superior del mapeador.

Editamos AsigFactura. En este caso El web service de facturar va a necesitar una variable cuantía, que es el resultado de multiplicar las unidades encargadas por el precio unitario. Para hacer esta transformación, seleccionamos en la parte derecha la variable cuantía. Cuando se ilumine la franja horizontal, desplegamos el menú Operator y seleccionamos Multiplication. La salida de la multiplicación la asignamos a cuantia, y los operadores de entrada son unidades y precioUnidad. Arrastramos sus nombres hacia el operador, y quedará como en la siguiente imagen:

Asignar valores a la invocacion de facturacion
Asignar valores a la invocación del servicio de facturación

Editamos ahora AsigNoStock. Estamos en el camino del ‘else’, y tenemos que asignar a la variable de la actividad de respuesta un valor que exprese que no se ha podido completar el proceso debido a la falta de stock de producto. Dicha variable es VentaLibrosWSDLOperationOut1 y su mensaje es resultado. Seleccionamos esta variable, accedemos al menú String, seleccionamos String Literal, introducimos la cadena Stock en almacen insuficiente y lo asignamos a resultado:

Respuesta indicando la falta de stock del producto
Respuesta indicando la falta de stock del producto

Tras la sentencia de selección nos encontramos con la actividad de asignación AsigOrden, que establecerá los valores de las variable EnviarProductoIn para la invocación al servicio de mensajería para que venga al almacén a recoger y repartir el pedido. EnviarProductoIn tiene dos parámetros en el mensaje: empresa, que será un literal, e idPedido, que será el resultado de la invocación al servicio de Facturación. Por tanto la asociación quedará de la forma:

Valores para invocar al servicio de mensajeria
Valores para invocar al servicio de mensajería

Finalmente editamos AsigOk, que asignará a la actividad de respuesta final un mensaje de confirmación de venta indicando el id de albarán dado por el servicio de facturación y los dias que tardará en entregarse, indicado en la respuesta del servicio de mensajería. Concatenaremos en este caso varios literales con la respuestas de los servicios:

Asignacion de resultado a la actividad de respuesta
Asignacion de resultado a la actividad de respuesta

Por último tenemos que establecer la condición de la estructura de bifurcación. Pulsamos dos veces sobre la estructura del If, y utilizando el menú Boolean y los elementos Logical And y Logical True componemos la condición booleana en base a la respuesta del servicio de comprobación de stock:

Condicion de la decision del proceso de BPEL
Condición del proceso sobre la existencia de stock

En este punto el proceso BPEL estará finalizado, sin mensajes de error ni advertencias, listo para ser probado:

Proceso BPEL implementado correctamente
Aspecto final del proceso de negocio con BPEL

Continuación…

Este tutorial continua en Tutorial de BPEL con OpenESB (II)

 

6 COMENTARIOS

  1. Muy bueno, quería ver en que consistía BPEL y este tutorial me ha ayudado a tener una visión de conjunto, explicado de una forma sencilla y agradable.

  2. Hola, estoy aprendiendo acerca de BPEL y web service, segui los pasos del tutorial y la verdad no se como probarlos, podrias indicare como o enviarme algun tutorial por favor ? muchas gracias de antemano.

  3. Buenas noches
    Quisiera saber cómo evaluar si una variable es nula y también cómo asignar a una variable de salida de tipo base64Binary el valor de null.
    Gracias!

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