Ejemplos en BPEL Parte 2. DB Adapter
¿Qué tal?
En este
post voy a continuar con el ejemplo que comenzamos hace algún tiempo sobre
BPEL. Para refrescar la memoria, visiten este link. El BPEL como lo dejamos la
vez pasada quedó solo con una actividad Assign, tal como se muestra en la
siguiente imagen:
Lo siguiente que haremos es agregar un
adaptador de base de datos para realizar una consulta de Productos y desplegar
el resultado. Para lograrlo, arrastramos el componente Database Adapter desde
la paleta de componentes, en la pestaña BPEL Services, hacia la parte derecha
en la sección Partner Links.
La ventana emergente solicitará los datos para
configurar el adaptador. El primero de ellos es el nombre que le vamos a dar,
en este caso lo nombraremos Productos.
Después, seleccionamos la conexión a la base de
datos que previamente configuramos (en el post anterior).
El siguiente paso es seleccionar la operación Select.
Dar clic en el botón Import Tables, realizar la búsqueda de la
tabla, en este ejemplo se llama Producto, luego seleccionarla y pasarla del
lado derecho usando la flecha.
Una vez que se haya terminado de importar la tabla, dar Next hasta llegar a la pantalla de selección de campos. Seleccionar los deseados para la consulta y continuar con Next.
Una vez que se haya terminado de importar la tabla, dar Next hasta llegar a la pantalla de selección de campos. Seleccionar los deseados para la consulta y continuar con Next.
En la
siguiente pantalla agregar un parámetro para filtrar la búsqueda de los
registros en la tabla. Clic en Add e
introducir el nombre del parámetro de nuestro query, en este caso se llama codigoProducto.
Después, editamos el query generado para
agregar la sentencia al filtro sobre el campo codigoproducto. Para esto es necesario dar clic en Edit, luego en
la ventana emergente, Add. Se llenan los campos de la parte de abajo con
valores default y es necesario editarlos dando clic en Edit.
Seleccionar el campo deseado para el filtro de
la consulta, en este caso es codigoproducto.
Seleccionar la opción Parameter del check box y verificar que codigoProducto esté seleccionado. Ok para continuar.
Nuestro query debe quedar como se muestra en la
siguiente imagen
Dar clic en Next hasta llegar al
final de la edición. Se mostrará una última ventana que muestra el resumen de
lo creado. En ella se especifica que se generó el archivo Productos.wsdl mismo que tiene la información requerida para ejecutar
la invocación del query. Dar clic en OK para finalizar.
El BPEL queda de la siguiente manera:
En la parte izquierda del Appication
Navigator, podemos observar que se generaron varios archivos, tales como Productos.wsdl, Productos-or-mappings.xml, productos.properties y Productos_table.xsd. Todos ellos hacen
referencia a la configuración y a los mensajes que se enviarán durante la
invocación del query.
El archivo que me parece más relevante de
explicar es el llamado Productos_db.jca. En éste podemos identificar varios
elementos importantes, como por ejemplo la referencia hacia el archivo
Productos.wsdl, donde se refleja la relación de la operación ProductosSelect
con los mensajes de entrada y salida ProductosSelect_inputParameters y ProductoCollection_msg,
así como también hacia el archivo Productos-or-mappings.xml que contiene el
mapeo de datos expresado en xml para el query ProductosSelect en relación a las
tablas involucradas, para quien esté familiarizado con hibernate, es algo
similar. También en el archivo .jca se configura el Connection Factory con el
nombre configurado en el Weblogic, en este caso el nombre de la conexión BDLocal es el que configuramos
previamente (en el post anterior) en JDeveloper para poder conectarnos a la BD y así generar el
query. Una vez que el BPEL esté desplegado en el servidor, no se usará más, lo
que si se usará en cambio es el atributo location,
que para este ejemplo se llama eis/DB/BDLocal.
Si no tienen muy claro como configurar el Connection
Factory en el Weblogic, sigan estos pasos que se dividen en dos; el primero es
crear el data source y el segundo agregar el Connection Factory en el
DBAdapter.
1. Entrar y hacer login en la consola de administración
del Weblogic y ubicar la sección Data
Sources, dar clic sobre ésta para abrir la configuración, una vez que se
muestre la pantalla, seleccionar New
y Generic Data Source. Nota, para los
ambientes que no son de Desarrollo, para poder editar es necesario primero
generar una sesión, para eso dar clic en Lock & Edit.
Asignar un nuevo nombre al data source y otro
al jndi. Next.
En el siguiente paso se selecciona el driver de
acuerdo al tipo de base de datos, en mi caso es una base Oracle. Next.
Lo siguiente es introducir todos los datos de
la conexión de la base de datos. Next.
Saltar el siguiente paso hasta llegar a la
parte de testing. Clic en Test Configuration
El resultado debe ser exitoso, si no es así,
quiere decir que algo está mal con los datos introducidos o bien, con la base
de datos. Finish.
2. Ahora lo que resta es agregar el Connection
Factory en el DBAdapter, para eso es necesario seleccionar el link Deployments.
Buscar en la lista de la derecha el recurso
DBAdapter y dar clic sobre él.
En la pantalla siguiente, seleccionar la
pestaña Configuration, después Outbound Connection Pools y New.
Seleccionar el radio botón javax.resource.cci.ConnectionFactory.
Después Next
Introducir el nombre de jndi que deseamos
asignarle (éste es el que se configura en el archivo .jca del BPEL). Finish.
Una vez creada con éxito la conexión,
seleccionarla de la lista para editar sus propiedades
Agregar el datasource en la propiedad xADatasourceName dando clic en el
renglón vacío de la derecha, introducir el nombre seguido de un Enter. Si no se realiza este último
paso, se borra el valor y no se registrará el cambio. Cabe mencionar que en
este caso estamos ingresando el datasource como xADataSource (para
transacciones distribuidas) debido a que así fue como lo configuramos en pasos
anteriores, si el datasource es NonXA (transacciones en una sola BD), se debe
establecer la propiedad dataSourceName en lugar de xADatasourceName. Save.
El mensaje de
éxito debe aparecer una vez que se realizó con éxito la edición.
Tal como lo dice el mensaje de confirmación, es
necesario hacer un update al adaptador para que se reflejen los cambios, esto
lo hacemos de la siguiente forma. Regresar a la pantalla Deployments, buscar en
la lista el recurso DbAdapter y seleccionar el check box. Como nota adicional,
mi ambiente está configurado como de Desarrollo, por lo que la activación de
cambios es automática, si el ambiente donde estén realizando esto tiene otra
configuración, pedirá activar los cambios antes de continuar
En la parte superior de la lista seleccionar
Stop y luego Force Stop Now (esto implica que se dará de baja el adaptador,
por lo que ningún proceso podrá usarlo mientras se realizan estos pasos)
Una vez que finalice, se debe mostrar el
mensaje de éxito
Buscar nuevamente el recurso DbAdapter,
seleccionar el check box correspondiente y dar clic en Update. Aparecerá la
siguiente pantalla. Finish para terminar.
Una vez que terminó de hacer el update, buscar
nuevamente en la lista el DbAdapter, seleccionar el check box y la opción Start
y después Servicing all requests.
Cuando haya finalizado y se muestre el mensaje
de éxito, activar los cambios si es que así lo requiere y verificar que el
estado del DbAdapter sea Active y OK.
Con esto es suficiente para configurar el
datasource y el Connection Factory requerido para desplegar el proceso, por lo
que retomaremos el flujo de nuestro BPEL. Los siguientes pasos son para hacer
la invocación del query y regresar una respuesta.
Arrastrar una actividad Invoke desde la paleta
de componentes hacia la parte central del BPEL, justo arriba de la actividad
detalleRespuestaAssign.
Después, extender la flecha lateral del Invoke1
hacia el Partner Link Productos.
Se abrirá una ventana emergente, en ésta
cambiar el nombre de la actividad a selectProductosInvoke, después agregar una
variable de Input usando el icono verde Add y asignar el nombre de la variable
como selectProductosInvoke_InputVariable. OK.
De esta misma forma en la pestaña Output,
agregar la variable de salida selectProductosInvoke_OutputVariable. OK y OK
para cerrar la ventana.
Para poder establecer los valores de la variable
de entrada a nuestro query es necesario hacer una asignación desde el parámetro
de entrada del BPEL hacia el parámetro de entrada del invoke.
Arrastrar una actividad Assign antes del invoke
y llamarla parametrosSelectAssign. En
el lado izquierdo de la ventana emergente, expandir el árbol de la variable inputVariable (variable de entrada del
BPEL) hasta llegar al elemento codigoProducto,
del lado derecho expandir el árbol de la variable selectProductosInvoke_InputVariable (variable de entrada al invoke
Productos) hasta llegar al elemento codigoProducto.
Ya en éste nivel, arrastrar de izquierda a derecha el elemento. OK.
El siguiente paso es editar el Assign de
respuesta detalleRespuestaAssign.
Doble clic sobre la actividad, y nuevamente doble clic sobre el concat de la variable detalle. En la ventana emergente de
edición agregar el precio al texto de la siguiente manera:
concat('El producto ',
$inputVariable.payload/ns1:nombreProducto, ' ha sido recibido y su precio actual
es ',
$selectProductosInvoke_OutputVariable.ProductoCollection/ns4:Producto/ns4:precio)
Recuerden hacerlo arrastrando la variable en
lugar de escribirlo, será mucho más fácil. Nota: la variable selectProductosInvoke_OutputVariable contiene
una colección de elementos obtenidos de la consulta a la base de datos, lo
ideal es iterar dicha colección o bien acceder a sus elementos como un arreglo
usando los corchetes [] y la posición deseada. En este ejemplo, el query nos
regresará un único registro, por lo que la colección solo tendrá un elemento y
en estos casos no es necesario agregar corchetes. En caso de que la colección
tuviera más de uno, una forma de obtener el primer elemento sería:
$selectProductosInvoke_OutputVariable.ProductoCollection/ns4:Producto[1]/ns4:precio
Si no se hace de esta manera, se generará una
excepción de BPEL.
Una vez finalizada la edición dar clic en OK y
nuevamente OK. En este momento así es como luce nuestro flujo:
Desplegar el servicio en el servidor como lo
hicimos en el post anterior, y probarlo desde el Enterprise Manager o algún
otro cliente de WS.
La tabla Producto de mi base de datos contiene
la siguiente información:
Usaré el segundo registro para la
prueba:
El resultado con estos datos es el siguiente:
Bien, pues con esto terminamos el ejemplo del
día de hoy, espero que haya sido de utilidad. Continuaremos agregando funcionalidad a nuestro BPEL en el siguiente post.
¡Hasta pronto!
Si te interesa conocer más de ésta y otras tecnologías de Oracle, te recomiendo que visites la página de Oracle Technology Network Latinoamerica http://www.oracle.com/technetwork/es/index.html. Aquí podrás encontrar artículos, información, actividades y muchas otras cosas más, además de poder acercarte a los expertos en varios idiomas.
Si te interesa conocer más de ésta y otras tecnologías de Oracle, te recomiendo que visites la página de Oracle Technology Network Latinoamerica http://www.oracle.com/technetwork/es/index.html. Aquí podrás encontrar artículos, información, actividades y muchas otras cosas más, además de poder acercarte a los expertos en varios idiomas.
Hola muy buen post, en realidad estoy aprendiendo mucho pero tengo una duda yo estoy usando el oracle suite 12.1.3... con que base de datos debo instalarla (version 11g o 12 c)? y la otra duda que tengo es que diferencia hay entre un proceso bpel y crear un web service por bus, ojala puedas ayudarme
ResponderBorrarMuchas gracias Cristian,
BorrarSi estás instalando la versión completa de SOA Suite(la que no es Quickstart) puedes usar la versión 11g de la BD.
La diferencia entre un BPEL y un Servicio en OSB radica en que un compuesto BPEL lo debes usar cuando tienes un proceso de negocio de más larga duración que un simple proxy, además de requerir orquestar varios elementos, servicios, adaptadores, manejo de compensación de errores, etc.
Estas características, aún cuando es posible, no deberías implementarlas en un servicio en OSB, éstos tienen que reducirse a ser un proxy con unicamente validaciones y enriquecimiento de mensajes, enrutamiento, transformación de datos, conversión de protocolos, etc.
Sé que es un poco complicado, pero eventualmente podrás identificar cuando se trata de uno u otro a la hora de diseñar tus servicios.
Espero que esto te ayude un poco y no te haya confundido más.
Saludos!
Hola Sandra , excelente post muchas gracias por compartir la información , sin embargo, pareciera que hace falta un paso, enlazar el BPEL con el adaptador de BD en el composite.
ResponderBorrarSaludos