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.


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.

Comentarios

  1. 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

    ResponderBorrar
    Respuestas
    1. Muchas gracias Cristian,

      Si 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!

      Borrar
  2. 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.

    Saludos

    ResponderBorrar

Publicar un comentario

Entradas más populares de este blog

Conceptos básicos de Servicios Web SOAP, WSDL y XSD

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

Conversión de servicios SOAP a REST/JSON usando OSB 11g