lunes, 20 de abril de 2015

WSO2 BPS: Uso de un ForEach en BPEL.


En una entrada anterior realizamos una introducción al desarrollo de procesos con BPEL y la suite de WSO2 a través de un escenario simple que involucraba el consumo de varias operaciones de servicios web externos desde un BPEL.
En esta entrada, para continuar con los temas de BPEL y la suite de WSO2, mostraremos como implementar un escenario de un poco más de complejidad que involucra utilizar un iterador para realizar determinada lógica de negocio.
La descripción del escenario es la siguiente:
Se tiene acceso a un servicio web que dado el nombre de una persona devuelve:
  • nombre.
  • apellido.
  • listado con los ID de las direcciones relacionadas con esta persona.
Para obtener la información completa de una dirección se tiene acceso a otro servicio web que dado el ID de una dirección devuelve:
  • calle.
  • numero.
  • prov.

Se desea exponer a través de un servicio la información completa de una persona de manera tal que contenga los datos personales del usuario y un listado con los datos completos de sus direcciones asociadas.
Para implementar este escenario bien podríamos usar el WSO2 ESB, pero en este caso en particular usaremos el WSO2 BPS para demostrar el uso del componente iterador.

En la siguiente imagen mostramos la implementación visual del proceso.

UsuariosDireccionProcess

Al proceso le llega como entrada el nombre del usuario, por lo que esta información es asignada a la variable de entrada usada para invocar al servicio UsuariosData.
A continuación inicializamos 2 variables: una contendrá un elemento de tipo Direccion para almacenar la dirección que retorne la invocación del segundo servicio,pues esta se pierde en el ForEach, mientras que la segunda variable será de tipo un arreglo de Direccion para almacenar el listado de direcciones asociadas a un usuario. La respuesta de la invocación al segundo servicio no se inserta directamente en este arreglo pues primero debe pasar por una transformación ya que no coinciden los nombres de los elementos.
Teniendo la respuesta de la primera invocación al servicio UsuariosData podemos usar el componente ForEach e iterar por cada ID de direccion que exista, tal y como se muestra a continuación.


image
Usando esta expresión XPATH:
count($UsuariosDataPLResponse.parameters/Usuarios[1]/idDirecciones/idDireccion)
Podemos contar la cantidad de ID contenidos en la respuesta y ese será el valor final de nuestro ForEach.
Lo que sigue es básico:
  • Guardamos el valor del ID actual.
  • Asignamos este ID al request de la invocación al servicio DireccionUsuario.
  • La respuesta de este servicio la asignamos a la variable DirOK, que es de tipo direccion.
  • Insertamos esta variable como último elemento del listado de direcciones, que se ha creado en la variable listadoDirecciones.
Este último punto lo mostramos en la siguiente imagen pues se hace uso de una función xpath especifica de Apache ODE.


image

Consideraciones finales.
  1. La implementación del proceso es bastante fácil de lograr, y sigue una línea que se ajusta bastante a como se podría implementar con Oracle BPEL.
  2. El IDE aun tiene sus pequeños bugs…en determinamos momentos me movió secciones de código del inicio para el final o no me reconocía las variables con los tipos de datos que le asociaba, es cosa de cerrar y volver a abrir el .bpel.
  3. La expresión xpath de ODE no es reconocida y da un warning, aunque funciona sin problema.
  4. Se detectó un ¿bug? de Apache ODE que pueden ver comentado y con un work around en este enlace. La solución propuesta es realmente simple y fácil de implementar.
  5. A la implementación actual le falta aun el manejo de errores, lo cual será incorporado en una siguiente entrada.
  6. También incorporaremos la posibilidad de recibir en la invocación al servicio UsuariosData, varios usuarios en vez de solo uno.

A pesar de los problemas antes mencionados y teniendo en cuenta la fácil integración del WSO2 BPS con el resto de las herramientas de la suite de WSO2, es factible el uso de la misma para la implementación de BPEL de pequeña o mediana complejidad. Ya para implementaciones que requieran de transformaciones y mapeos muy grandes no creo que sea muy productiva como digamos el BPEL de Oracle con su automapping incluido.

El fuente del proyecto, que incluye los WSDL de los servicios BE se encuentra en este repo.