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.
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.
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.
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.
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!
Excelente aporte!!
ResponderBorrarMuchas gracias, espero pronto poder darle continuidad. Saludos!
ResponderBorrarWooow muy entendible gracias, tendras alguna web donde tengas mas info de esta???
ResponderBorrarHola Luis, muchas gracias!
BorrarPor el momento no he hecho más ejemplos, he tenido muy poco tiempo diponible. Espero retomarlo pronto.
Saludos
De maravilla, para ser el primer ejemplo puesto en practica
ResponderBorrarMuchas gracias Ayrton, me da gusto saber que es de utilidad este ejemplo. Saludos!
BorrarMuy 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
ResponderBorrarHola 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.
BorrarSaludos!
Hola Sandra,
BorrarTe 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
Muchas gracias, me sirve mucho para introducirme en el trabajo
ResponderBorrarQue gusto saberlo Marcos!
BorrarSaludos.
Excelente aporte Sandra, te felicito , muestras con gran facilidad el ejercicio practico del OSB. Ayudas mucho a personas como yo que estamos en aprendizaje.
ResponderBorrarMuchas gracias Emmanuel, me da muchísimo gusto saber que te ha servido. Entonces ha valido la pena.
BorrarSaludos!
Muchas gracias!! :D
ResponderBorrarMuy util y muy claro felicidades.
Gracias a ti!
BorrarMe alegra saber que es útil para ti.
Saludos!
Excelente!
ResponderBorrarSaludos
Mil gracias Arturo,
BorrarSaludos!
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...
ResponderBorrarHola Aleyda, perdón por la tardanza.
BorrarEspero 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!