Ejemplos en BPEL Parte 1. Lo esencial



¡Hola!


El día de hoy y durante los siguientes posts estaremos realizando ejercicios en BPEL. Comenzaremos con lo más básico e iremos incrementando la complejidad de las operaciones de nuestro proceso. Pero antes de llegar a la acción es importante dar una pequeña introducción.


BPEL (Business Process Execution Language) es un lenguaje de programación basado en WSFL (Web Services Flow Language) y XLANG (eXtensible Language). Se interpreta como XML,  sin embargo es posible programarlo en modo visual, de manera tal que se convierte en una especie de diagrama de flujo funcional, donde se recibe cierta información, se realizan determinadas actividades y finalmente se genera una respuesta (aunque ésta última no necesariamente en todos los casos).



Su uso más común es exponer un flujo de negocio como un Servicio Web estándar SOAP, pero además de eso, es posible exponer dicho flujo con otra finalidad, por ejemplo, un BPEL que será usado únicamente de manera interna por otros procesos BPEL,  o un BPEL que se disparará con una acción, como en caso de detectarse un archivo nuevo en un FTP, o con un mensaje JMS, un evento, etc. Durante esta serie de ejercicios veremos varias de las posibilidades.



Como primer ejercicio veremos las partes que conforman un proceso BPEL y crearemos uno muy sencillo. Antes de comenzar, recomiendo leer mi post Conceptos básicos de Servicios Web, WSDL y XSD, si no están muy familiarizados con estos términos o desean repasarlos, ya que es básico conocerlos para trabajar con BPEL.



Para poder programar nuestro proceso BPEL (generado con las herramientas Oracle) necesitamos un editor adecuado, en este caso JDeveloper con la extensión para SOA, yo usaré la versión 11.1.1.5, y para poder probarlo es necesario tener un ambiente SOA instalado y listo para deployar procesos. Si no tienen ninguno instalado y quieren saber cómo hacerlo, les recomiendo mi post de Instalaciónde la SOA Suite de Oracle 11.1.1.5.



1. El primer paso para generar nuestro BPEL es crear una aplicación, luego dentro de ésta, un proyecto SOA. En JDeveloper, en el menú File, New, seleccionar Applications dentro de la opción General, luego en el lado derecho seleccionar SOA Application y Ok. Si no aparece esta opción significa que no está instalada la extensión SOA.

 


2. Introducir el nombre de la aplicación, la ruta donde se crearán los archivos y Next.



3. Introducir el nombre del proyecto SOA y asegurarse que la tecnología seleccionada sea SOA.



4. Introducir el nombre del Composite, verificar que esté seleccionada la opción Empty Composite y Finish.



5. La siguiente pantalla muestra lo que veremos una vez creado el proyecto SOA. Hay que destacar varios elementos importantes. El proyecto generado tiene varias carpetas vacías y un archivo llamado composite.xml, en este archivo, visto en modo de diseño se observan tres secciones: la del lado izquierdo, llamada Exposed Services, que contiene los elementos que definen la forma en la que nuestros componentes serán expuestos, ya sea como un Servicio Web, un evento, etc. La sección media, llamada Components, contiene los procesos BPEL y otros componentes disponibles, por ejemplo Business Rules, Mediator, Human Task y Spring Context. En la sección de la derecha, llamada External References, contiene los elementos con los cuales nuestros componentes tendrán relación, estos pueden ser queries a bases de datos, invocación a otros Servicios Web, archivos de sistema, FTP, EJB, entre muchos otros. Y por último está la paleta de componentes y adaptadores disponibles.

 

6. Para generar el BPEL es necesario primero definir la estructura de los mensajes de entrada y salida en un archivo de esquema xsd. En el explorador de proyectos, seleccionar la carpeta xsd, clic derecho y New.

 

 

7. En la categoría General, seleccionar File

 

8. Introducir el nombre y extensión del archivo.


 

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:inv="http://blog.soa.ejemplos/Inventario"
            targetNamespace="http://blog.soa.ejemplos/Inventario"
            elementFormDefault="qualified">
   
  <!-- Elemento que representa el objeto de entrada para el BPEL de inventario -->
  <xsd:element name="inventarioRequest" type="inv:InventarioRequest"/>
 
  <!-- Elemento que representa el objeto de respuesta del BPEL de inventario -->
  <xsd:element name="inventarioResponse" type="inv:InventarioResponse"/>
 
  <!-- Tipo complejo que representa los datos del objeto de entrada para el BPEL de inventario -->
  <xsd:complexType name="InventarioRequest">
    <xsd:sequence>
      <xsd:element name="codigoProducto" type="xsd:string"/>
      <xsd:element name="nombreProducto" type="xsd:string"/>
      <xsd:element name="categoria" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>

  <!-- Tipo complejo que representa los datos del objeto de respuesta del BPEL de inventario -->
  <xsd:complexType name="InventarioResponse">
    <xsd:sequence>
      <xsd:element name="codigo" type="xsd:string"/>
      <xsd:element name="descripcion" type="xsd:string"/>
      <xsd:element name="detalle" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>         
</xsd:schema>



En la siguiente imagen observamos que el elemento que representa la estructura de datos de entrada al BPEL es inventarioRequest y la de respuesta es inventarioResponse. Los tipos que los representan son InventarioRequest e InventarioResponse respectivamente, los datos que estos elementos contemplan son; codigoProducto, nombreProducto y categoria para la entrada y codigo, descripcion y detalle para la respuesta.

 

 

10. Una vez terminado nuestro xsd, el siguiente paso es crear el BPEL. Es necesario abrir el archivo composite.xml en la vista de diseño, desde la paleta de elementos y arrastrar el componente BPEL Process hacia la sección media llamada Components.


11. Esta es la imagen de la pantalla que aparecerá para configurar algunas opciones del BPEL.



El primer campo es un radio botón para elegir la versión del lenguaje BPEL que se usará, la versión 1.1 y la 2.0. Hay algunas diferencias entre ellas, por ejemplo los elementos disponibles y obviamente algunas mejoras en la versión 2.0. Yo por lo general uso la 2.0 puesto que algunos detalles se vuelven más amigables, aunque debo confesar que también he tenido algunos problemillas por usarla, sobre todo por las funciones XPath avanzadas, porque no todas las versiones del Weblogic tienen las librerías precargadas, para este ejemplo no hay ningún problema en usar la 2.0.

 

El siguiente campo es el nombre que le daremos a nuestro BPEL, el siguiente es el Namespace con el cual se calificarán los elementos definidos en el BPEL, como lo comenté anteriormente, el código generado es un xml, por lo tanto debe tener todos sus elementos válidos para funcionar. Después veremos el campo Template, éste tiene las opciones:

  • Asynchronous BPEL Process: Es usado cuando se desea que el proceso sea asíncrono, es decir, el cliente que realice la invocación no espera una respuesta para continuar, sin embargo es posible notificarle cuando el proceso BPEL termine. 
  • Synchronous BPEL Process: Se usa cuando se desea que el proceso sea síncrono, es decir, el cliente que realice la invocación no continuará su ejecución hasta obtener una respuesta del BPEL, ya sea exitosa o con error o excepción. Para nuestro ejemplo usaremos esta opción.
  • One Way BPEL Process: Es usado cuando se desea que el proceso sea en un solo sentido, es decir, el cliente que realice la invocación no desea una respuesta en ningún momento por parte del BPEL. 
  • Define Service Later: Se usa para crear un BPEL sin ninguna estructura definida pero que en algún momento será agregada manualmente. 
  • Base on a WSDL: Se usa cuando ya se tiene un WSDL válido que se tomará como base para crear el BPEL. 
  • Subscribe to  Events: Es útil para crear un BPEL que será disparado por medio de un evento de tipo EDN (Event Driven Network). Estos eventos pueden estar previamente generados y configurados para ser usados en este punto, o bien, pueden ser creados en el momento.

 


A continuación está el campo Service Name, que indica el nombre del servicio que representa a nuestro BPEL.



Después podemos ver el checkbox Expose as a SOAP Service.  Debemos seleccionarlo cuando necesitamos que el proceso BPEL se pueda publicar como un Servicio Web tipo SOAP, esta opción genera los elementos y estructura necesarios, si no hacemos esto el BPEL no podrá consumirse con un cliente de Web Services.


Los siguientes campos son Input y Output, aquí se eligen los elementos xsd que representan los datos de entrada y salida del BPEL. 

 


Usando el ícono de búsqueda, se abrirá el explorador para elegir los elementos que creamos recientemente en nuestro archivo xsd. Seleccionar inventarioRequest para Input e inventarioResponse para Output.

 

 

Así es como debe quedar la configuración de nuestro ejercicio, dar clic en OK al finalizar la revisión. Es importante poner atención en esta imagen y hacerlo de la misma forma.

 

 

12. Al finalizar la configuración, tenemos los siguientes elementos creados:

 

Como se puede observar, se generaron varios archivos en el proyecto, tales como BPEL_Inventario.bpel, BPEL_Inventario.componentType y BPEL_Inventario.wsdl. Además, en el archivo composite.xml se agregaron dos elementos, en el centro el que representa al BPEL y de lado izquierdo el que representa cómo se expone dicho BPEL. Demos doble clic en el BPEL para poder editarlo.

Así es como se ve el BPEL síncrono recién creado. En el centro tenemos una actividad de inicio, seguido de una actividad Receive, después otra de tipo Reply y una más de fin. Es aquí donde pondremos las actividades pertinentes para solventar el requerimiento de funcionalidad. En el lado izquierdo, la cajita que vemos representa el punto de entrada y salida del servicio, es decir, aquí comienza todo, el flujo de actividades se dispara al recibir la petición del Partner Link y cuando se termina se regresa a este mismo punto para poder devolver la respuesta.

 


13. Usando la paleta de componentes, arrastrar una actividad Assign justo en medio de receiveInput y replyOutput. 



14. Dar doble clic en la actividad agregada para configurar las opciones. La pantalla que se verá es la siguiente. En esta pantalla, en la pestaña General cambiemos el nombre a detalleRespuestaAssign y en la pestaña Copy Rules cambiaremos la regla de asignación, lo que haremos es obtener el valor del campo de entrada nombreProducto y lo concatenaremos con un texto cualquiera, para realizar esto necesitamos usar una función XPath, el cual es otro lenguaje de programación soportado por la herramienta.



Los elementos que nos interesan más de esta ventana son los que se encuentran en la parte superior derecha



El primer ícono sirve para agregar expresiones y funciones XPath a nuestras variables, el siguiente es para asignarles valores fijos, el siguiente es para removerlas completamente de un nodo, la siguiente se usa para renombrarlas, y el último sirve para hacerles cast sobre sus tipos de datos.



Para usar una función XPath, basta con seleccionar el ícono y arrastrarlo directamente a una variable. Es importante recordar que estamos tratando con un xml, por lo tanto las variables declaradas en el BPEL representan una estructura xml. Es necesario expandir el árbol de ésta estructura para llegar hasta el último nivel, donde se encuentran las variables.


15. Para nuestro ejemplo, expandir la estructura del lado derecho hasta llegar a la variable de salida llamada codigo, es aquí donde se debe arrastrar el ícono de expresión XPath.



16. La siguiente ventana es el editor de expresiones XPath, en esta variable solo pondremos el texto ‘0’ (incluyendo las comillas simples ya que es un string) y al finalizar OK




17. Hacemos lo mismo para la variable descripcion, en este caso introducir el texto: ‘OK’. Para el caso de  detalle haremos la concatenación de una de las variables de entrada con un texto. De igual manera arrastrar una expresión XPath hacia la variable y en el editor escribir la siguiente expresión:



concat('El producto ', $inputVariable.payload/ns1:nombreProducto, ' ha sido recibido.')

Es importante mencionar que la ruta de la variable nombreProducto puede variar de acuerdo a los namespaces de cada proyecto y además de la versión de SOA que se está usando, para evitar errores es mejor seleccionar la variable de la sección BPEL Variables y dar doble clic sobre ella o usar el botón Insert Into Expression, para que sea la herramienta quien genere esta ruta. De igual forma, la función concat se puede escribir directamente o seleccionar de la lista de opciones que se encuentra en la categoría String Functions en la sección Functions. Al final la expresión sin errores queda de la siguiente manera, revísenla muy detenidamente antes de continuar (si aparece el texto subrayado en rojo significa que no están escribiendo de forma correcta la expresión y es necesario rectificarla). Una vez terminada la edición dar clic en OK.



La actividad de asignación con las 3 funciones queda de la siguiente manera, después de revisarla presionar OK para finalizar.



Lo que hicimos en la actividad Assign fue establecer los valores de las variables de salida, por lo tanto, si desplegamos el proceso y lo probamos, seremos capaces de ver una respuesta. Para hacer esto es necesario tener un ambiente ejecutándose efectivamente donde podamos hacer el despliegue.

18. En el Application Navigator, seleccionar el proyecto y dar clic derecho sobre éste, ir a la opción Deploy y seleccionar InventarioComposite.

 

19. En la ventana de configuración de Deployment, seleccionar Deploy to Application Server. Esta opción sirve para hacer el despliegue directamente en el servidor, si se selecciona la opción Deploy to SAR, sólo se generará un archivo jar que después tendrá que ser desplegado manualmente en la consola del Enterprise Manager.

 


20. Seleccionar la opción Overwrite any existing composites with the same revisión ID, para asegurarnos de siempre sobrescribir sobre cualquier otro despliegue anterior con la misma versión del identificador de revisión. Si se desea hacer una nueva versión simplemente se debe cambiar el Revision ID, así las anteriores seguirán desplegadas sin verse afectadas con los nuevos despliegues.

 


21. En la siguiente pantalla se debe seleccionar el servidor en el cual se desea desplegar, si ya se tiene una conexión valida configurada, simplemente seleccionarla y dar clic en Next, si no es así, es necesario añadirla, para esto dar clic en el ícono add en la parte superior derecha.


22. En la siguiente pantalla introducir el nombre con el cual identificaremos el servidor y luego Next.


23. Introducir el usuario y password de conexión al servidor, este usuario tiene que tener los permisos necesarios para poder realizar despliegues, ya sea un perfil de administrador o algún otro más restringido.


24. Después, introducir los datos de conexión al servidor, ya sea por IP o nombre del host, los puertos y el dominio soa configurado y Next para continuar.

 

 

25. Para verificar que la conexión es correcta damos clic en el botón Test, al finalizar las pruebas el resultado de todas debe ser exitoso para poder continuar. Si alguna de las pruebas no fue exitosa quiere decir que los datos que introdujimos son incorrectos y es necesario corregirlos. Al verificar la correcta conexión dar clic en Finish y en la pantalla anterior Next.

 

26. En la siguiente pantalla verificar que la partición sea default o alguna otra que podamos recordar con facilidad. Clic en Next, revisar el resumen y luego Finish.


27. Para verificar que el despliegue se realizó correctamente, revisar la pestaña Deployment – Log en la parte inferior central del JDeveloper, el mensaje debe ser muy parecido a esto: 


28. En este momento ya estamos listos para probar nuestro proceso BPEL. Para esto haremos uso de la aplicación llamada Enterprise Manager. Esta herramienta es parte del BPM (Business Process Manager) así como de la SOA Suite y es sumamente útil ya que nos ayuda a visualizar, monitorear, probar y administrar procesos BPEL, servidores y particiones SOA entre otras aplicaciones y acciones adicionales.  Para acceder a esta aplicación es necesario hacer login en la ruta:


Obviamente si su servidor está en otro host y escucha por otro puerto, es necesario cambiarlos.


29. Una vez adentro, ir a la ruta de nuestro compuesto. En el árbol de la izquierda localizar el BPEL InventarioComposite y seleccionarlo. Se podrá ver lo siguiente:



30. Dar clic en el botón Test, esto lanzará un cliente de Web Services de prueba. Introducir los campos de entrada del BPEL en la pestaña Request y dar clic en Test Web Service. Nota importante, el campo WSDL contiene el URL de la ubicación del WSDL generado para nuestro BPEL, mismo que sirve para que cualquier cliente de Web Services SOAP pueda consumirlo.



31. Al terminar la ejecución se muestra el resultado en la pestaña Response. Revisemos lo que respondió el servicio, en el campo codigo el resultado fue 0, esto a manera de indicar que el proceso fue exitoso, en el campo descripcion el resultado fue OK, tal como lo pusimos en el Assign y finalmente, en la variable detalle el resultado fue la concatenación correcta del campo de entrada nombreProducto con el texto fijo que asignamos. Hagan viarias invocaciones cambiando los datos de entrada para observar mejor los de salida.

Una vez que analizamos la respuesta veamos lo que sucedió de manera gráfica. Para esto damos clic en el botón Launch Flow Trace.

32. Se abrirá la siguiente ventana, dar clic BPEL_Inventario.



33. En la pestaña Flow podemos visualizar el flujo que fue ejecutado en esta instancia del BPEL.


34. Si damos doble clic en las actividades podremos ver el detalle de la estructura de datos y/o las actividades realizadas internamente. Para verificar esto, dar doble clic en la actividad receiveInput. Aquí podemos ver la estructura de variables de entrada al proceso BPEL tal y como fue recibida.


35. Cerrar la ventana anterior y dar doble clic en la actividad detalleRespuestaAssign que agregamos. Aquí podemos identificar que se realizaron 3 actualizaciones de la variable de salida, mismas que creamos en el BPEL.


36. Por último dar doble clic en la actividad replyOutput. Aquí podemos ver la estructura de la respuesta de nuestro BPEL.



Bien, pues el ejemplo está terminado. Es muy básico pero nos ayuda a comprender las partes de un BPEL y cómo lo podemos probar. Cómo dije al principio, en los siguientes posts continuaremos con este ejemplo y le agregaremos más complejidad, hasta lograr un proceso muy completo.


Espero que la explicación haya sido clara y no tengan problemas para crear el suyo. En el siguiente post continuamos agregando funcionalidad.



¡Hasta la próxima!

Comentarios

  1. Muchas gracias, espero pronto poder darle continuidad. Saludos!

    ResponderEliminar
  2. Wooow muy entendible gracias, tendras alguna web donde tengas mas info de esta???

    ResponderEliminar
    Respuestas
    1. Hola Luis, muchas gracias!

      Por el momento no he hecho más ejemplos, he tenido muy poco tiempo diponible. Espero retomarlo pronto.

      Saludos

      Eliminar
  3. De maravilla, para ser el primer ejemplo puesto en practica

    ResponderEliminar
    Respuestas
    1. Muchas gracias Ayrton, me da gusto saber que es de utilidad este ejemplo. Saludos!

      Eliminar
  4. Muy bueno el tutorial, mis felicitaciones, pero lamentablemente no pude llegar a verlo, pues no me resulto el paso 26, donde se debe verificar que la partición sea default, no logro ver que se despliegue, por ende no pude dar finish, pues permanece des habilitado, si me pudieras orientar, saludos cordiales Julio Cesar

    ResponderEliminar
    Respuestas
    1. Hola Julio Cesar, que pena que no puedas terminar. Tendría que ver la pantalla o el problema para poder ayudarte, lo único que se me ocurre es que en vez de desplegarlo directamente al servidor, cuando hagas deploy elije la opción Deploy to SAR, esto va a crear un archivo .jar, ese lo puedes desplegar directamente en la partición que desees desde la consola del Enterprise Manager.

      Saludos!

      Eliminar
    2. Hola Sandra,
      Te comento que ya me resulto, pero eh tenido que hacer muchas cosas para que viera los resultados, desde instalar la SOA SUITE completa, modificar parámetros en la BD EE, agregar variables de entorno, y ampliar memoria para java, después de ellos por fin.
      De todos modos me gustaría comunicarme contigo en cuanto a dudas que me surjan, pues deseo aprender bien este mundo de SOA SUITE, y la implementación de Bpel
      Un afectuoso saludo, desde Santiago de Chile
      Julio Cesar

      Eliminar
  5. Muchas gracias, me sirve mucho para introducirme en el trabajo

    ResponderEliminar
  6. Excelente aporte Sandra, te felicito , muestras con gran facilidad el ejercicio practico del OSB. Ayudas mucho a personas como yo que estamos en aprendizaje.

    ResponderEliminar
    Respuestas
    1. Muchas gracias Emmanuel, me da muchísimo gusto saber que te ha servido. Entonces ha valido la pena.

      Saludos!

      Eliminar
  7. Muchas gracias!! :D
    Muy util y muy claro felicidades.


    ResponderEliminar
    Respuestas
    1. Gracias a ti!

      Me alegra saber que es útil para ti.

      Saludos!

      Eliminar
  8. Genial el tutorial, pero tengo instalada la versión 12c. pude avanzar hasta el paso 6, no me deja crear el archivo xsd. Sabes como puedo resolver para poder avanzar??. Gracias...

    ResponderEliminar
    Respuestas
    1. Hola Aleyda, perdón por la tardanza.

      Espero que hayas podido resolver tu problema, se me hace muy extraño porque no debería pasar eso, no tiene mucho sentido. Habrás creado la aplicación de tipo SOA?

      Saludos!

      Eliminar

Publicar un comentario

Entradas más populares de este blog

OWSM and WS-Security: Username Token Authentication for SOAP and REST Services in OSB 12c.