Ejemplos en BPEL Parte 3. Web Service Adapter

¡Hola!

En este post voy a continuar con el ejemplo BPEL que ya en dos ocasiones hemos trabajado. Para refrescar la memoria, visiten este link para el primer ejercicio y este otro para el segundo, y como recordatorio, estoy usando SOA 11.1.1.5. El BPEL como lo dejamos la vez pasada quedó tal como se muestra en la siguiente imagen


Lo que haremos hoy es agregar un adaptador de Web Service para invocar un servicio externo a nuestro BPEL, mismo que simulará una notificación vía correo electrónico. Este servicio externo no lo vamos a programar, solo es ilustrativo para nuestro ejercicio y de hecho no va acorde a la operación que estamos haciendo en el BPEL, que es un select a la base de datos, sin embargo funciona como ejemplo. Adicional a esto, crearemos una transformación XSLT para crear un mapeo de datos.

El primer paso es arrastrar el componente Web Service, desde la paleta de componentes, en la pestaña BPEL Services, hacia la parte derecha de nuestro composite.xml, en la sección External References.




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



El url del WSDL en mi caso es: http://localhost:8011/Utilerias/Notificaciones?wsdl. Aquí puedes descargar el archivo por si deseas usarlo en tu implementación.

La opción copy wsdl and its dependent artifacts into project, sirve para que se realice una copia del archivo WSDL y los que éste pudiera tener asociados, como por ejemplo esquemas XSD. Esta funcionalidad es útil para cuando queremos desarrollar en JDev pero no tenemos la conexión habilitada para el Servicio Web, o bien, éste no se encuentra disponible. Si no se selecciona, cada vez que abramos en Jdev el compuesto SOA, éste se tratará de conectar al Servicio Web y obtener su especificación, y si éste no está disponible, no se podrá acceder a sus operaciones. La desventaja de hacer una copia es que si el contrato (WSDL) cambia, es necesario realizar una reimportación o modificación de la copia del WSDL local.

Una vez hecho esto, continuar con OK. El siguiente paso queda de la siguiente forma. El WSDL que estoy importando tiene dependencia con 2 archivos XSD, y como solicité que se hiciera una copia de estos en mi proyecto, ahora puedo especificar si deseo que los 3 archivos se queden en la raíz o bien, los XSD los ponga en la carpeta xsd y el wsdl en raíz de mi proyecto con la opción Localize external references.


Una vez que hemos dado OK, verán que se agregó una cajita en el lado derecho, el siguiente paso es asociar el BPEL a ésta referencia para poder usarlo dentro del flujo del mismo. Realizar esto arrastrando la flecha del BPEL hacia el adaptador de Web Service que creamos.


Ahora editemos el BPEL dando doble clic sobre él y agregar una actividad Invoke después de selectProductosInvoke.


Después, asociar esta actividad hacia la referencia del Servicio Web de NotificacionAltaProducto.


En la ventana de configuración, cambiar el nombre a enviarNotificacionAltaInvoke, en la pestaña Input dar clic en el ícono verde + para agregar una variable de entrada y especificar el nombre, en mi caso es enviarNotificacionAltaInvoke_InputVariable, OK.


En la pestaña Output realizar lo mismo, clic en el ícono verde + para agregar una variable de salida, nombrar la variable enviarNotificacionAltaInvoke_OutputVariable, OK, y nuevamente OK para finalizar y cerrar la ventana.


Lo siguiente que haremos es agregar una actividad Transform, esto significa que crearemos una transformación o mapeo de datos usando XSLT, para llenar la variable de entrada a nuestro invoke.
Esta actividad está ubicada en la pestaña Oracle Extensions, en la paleta de componentes BPEL.


Arrastrar la actividad antes de enviarNotificacionAltaInvoke.


Se abrirá una ventana de configuración, en esta podemos identificar dos secciones, Source y Target, es decir, de qué fuente tomaremos los datos para asignarlos a cuál target. Para agregar una fuente dar clic en el ícono verde + y se abrirá una ventana para seleccionar la variable, en este caso me interesa obtener datos de la consulta que realizamos previamente a la base de datos, por lo tanto seleccionamos la variable selectProductosInvoke_OutputVariable. OK.
 

Ahora pata el target, es decir, hacia qué variable vamos a asignar estos valores, seleccionamos la variable de entrada al invoke de notificación, enviarNotificacionAltaInvoke_InputVariable.


En este caso particular, la variable de entrada al invoke de notificación tiene dos partes, un header y un body, seleccionaré la parte llamada parameters que corresponde al body. Esto no siempre es igual ni tampoco se llamará de esta forma, dependerá de la especificación que tenga el WSDL del
Servicio Web que estamos consumiendo. Finalmente cambiar el nombre de la transformación a inputToEnviarNotificacionAlta.xsl. OK para finalizar.


Como podrán ver, se crea el archivo y se abre en modo visual, del lado derecho tenemos el source y del lado izquierdo el target. La idea es llenar la estructura del target con los elementos del source y además podemos hacer uso de las funciones del lenguaje propio XSLT. De igual forma podemos ver y editar en modo código fuente, en la pestaña Source, en la parte inferior izquierda.


Lo primero que haremos es establecer el elemento email con texto plano, para hacerlo dar clic derecho en el elemento, luego Set Text, y Enter Text.


Escribir el texto de una cuenta de correo ficticia, luego OK. Hacer lo mismo para los elementos deseados, en mi caso el título y contenido del email.


Ahora utilizaremos una función XSLT para llenar una lista de elementos. En este ejemplo, el elemento listaProductos contiene un elemento llamado producto y dentro de éste se encuentran los datos como codigoProducto, nombre, detalle, etc. Si observan bien, el elemento producto tiene asociado un ícono en el costado derecho, diferente de los otros, una especie de eslabón doble, esto significa que es un elemento que se puede repetir n cantidad de veces, y para llenarlo de forma dinámica, agregaremos una función for-each. Clic derecho en el elemento producto, luego Add XSL Node, y for-each.


Se agregará un nodo previo a nuestro elemento producto e inicialmente tiene un círculo rojo, indicando que no ha sido asignado. Para asignarle un valor, arrastrar el elemento Producto del lado izquierdo, es decir, del source. Esto significa que para cada elemento Producto del lado izquierdo, se agregará un elemento producto en el lado derecho.


Continuemos con el mapeo de cada uno de los datos de la izquierda, para asociarlos con los que le corresponden en el lado derecho. A propósito dejé el elemento costo sin mapeo, esto debido a que agregaremos una función para concatenar el signo de pesos $ al valor que se obtuvo en el elemento precio.


Para hacer esta concatenación, arrastrar la función concat ubicada en la pestaña String Functions de la paleta de componentes, hacia el centro de la transformación.


Después, arrastrar el extremo derecho de la función hacia el elemento costo.


Luego, arrastrar el elemento precio hacia el extremo izquierdo de la función concat.


Dar doble clic en la función concat y en la ventana escribir el texto ‘$ ’ en el recuadro de abajo. Luego, para que la concatenación tenga primero el signo de pesos, clic en el botón Move Up. OK para terminar.


Al final, la transformación queda así


Como último paso, modificaremos la actividad detalleRespuestaAssign con el resultado de la invocación al Servicio Web de notificación, para saber qué fue lo que pasó al final de la ejecución. Dar doble clic en la actividad.


Nuevamente doble clic en el lado izquierdo donde está la asignación con la función concat que ya teníamos, para editarla. Le agregaremos lo siguiente a la concatenación:

, '. El resultado de la notificación por email es: ', $enviarNotificacionAltaInvoke_OutputVariable.parameters/ns7:mensajeRespuesta

De tal forma que la expresión completa queda como:

concat('El producto ', $inputVariable.payload/ns1:nombreProducto, ' ha sido recibido y su precio actual es ', $selectProductosInvoke_OutputVariable.ProductoCollection/ns4:Producto/ns4:precio, '. El resultado de la notificación por email es: ', $enviarNotificacionAltaInvoke_OutputVariable.parameters/ns7:mensajeRespuesta)

OK para cerrar la edición y OK para cerrar la ventana.


Al final, nuestro BPEL queda de la siguiente manera


Guardamos los cambios, y desplegamos el BPEL en nuestro servidor, tal como lo hemos hecho antes. Una vez terminado, probamos en la consola del EM.



Recordando que mi base de datos tiene la siguiente información:


Los datos de entrada para la prueba son:


El resultado de la prueba es el siguiente:


Como se puede apreciar, además del query a la base de datos para obtener el precio del producto, se invocó el Web Service de notificación, y la respuesta obtenida de dicho servicio es el texto Correo enviado. Sugiero que revisen el flujo del trace, para ir viendo paso a paso lo que se realizó durante la ejecución, esto dando clic en Launch Flow Trace.

Muy bien, pues hasta aquí dejaremos nuestro BPEL, en próximos post le agregaremos más funcionalidad.

¡Saludos, y 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 que tal, necesito saber como importar y exportar con y sin dependencias de recursos para osb 12c trabajando con ide jdeveloper desde la consola de osb que en esta version 12c no es como 11g :(
    saludos desde chile

    ResponderEliminar
    Respuestas
    1. Hola Carlos.

      Discúlpame, no había revisado este sitio en un rato. No estoy entendiendo bien tu pregunta, quieres importar/exportar proyectos y recursos osb en jdeveloper? A qué te refieres con que no es igual en 12c? Qué es exactamente lo que ves diferente?

      Saludos!

      Eliminar
  2. Hola Sandy, muchas gracias por dedicar tu tiempo y compartir tu conocimeinto. Hoy en día me estoy entrando al mundo de BPM, he instalado la Suite Oracle BPM 12c, he configurado el esquema de RCU, tengo JDeveloper como entorno de trabajo y finalmente tengo conexión con un servidor weblogic remoto. Pero me gustaría aprender más, es decir, crear mis propios flujos de trabajo mediante aplicaciones BPM, podrías hacer un tutorial de cómo crear un workflow básico y luego deployarlo en el servidor weblogic ?. Por favor.

    Muchas gracias de antemano, cualquier ayuda será bien recibida.

    Saludos.

    ResponderEliminar
    Respuestas
    1. Hola Car Ateneo

      Una gran disculpa, no vi tu comentario hasta hoy, perdona. Supongo que ya estarás muy avanzado en tus temas de BPM y espero que así sea.

      Por lo general no trabajo con BPM, únicamente con SOA. Por lo que no tengo algún ejercicio de esta herramienta.

      Saludos y buena suerte con tus implementaciones :)

      Eliminar
  3. Estimada una consulta, para esta parte de tu tutorial, el wsdl que utilizas se puede usar con cualquiera que tenga?

    ResponderEliminar
    Respuestas
    1. Hola!

      Así es, puede ser cualquiera que tengas publicado.

      Saludos.

      Eliminar
  4. Pero especificamente debe de ser con uno que se adecue a la logica del ejemplo que has desarrollado con el select del jca?

    ResponderEliminar
    Respuestas
    1. No necesariamente, puedes usar cualquier servicio web que tengas publicado, la idea de este ejemplo es como invocar un servicio externo.

      Saludos!

      Eliminar
  5. Buenos días, he estado haciendo el ejercicio de BPEL el cual me parece que esta muy completo. pero en esta parte 3 no pude avanzar mucho debido a que no cuento con el servicio al que haces referencia "Notificaciones.wsdl" es posible que me puedas enviar el servicio para así contunuar con el ejemplo. De ante mano muchas gracias. Feliz día.

    ResponderEliminar
    Respuestas
    1. Hola Prisco,

      Quizás ya es muy tarde, pero de cualquier forma comparto el archivo en Github

      https://github.com/sandyFloresMX/blogSOA

      Espero que hayas podido completar tu ejercicio.

      Saludos y disculpa la tardanza :(

      Eliminar
  6. Hola +Sandy ¿me puedes pasar el archivo "notificaciones.wsdl"? , no puedo avanzar al configurar el componente web service

    ResponderEliminar
    Respuestas
    1. Hola Ismael,

      Quizás ya es muy tarde, pero de cualquier forma comparto el archivo en Github

      https://github.com/sandyFloresMX/blogSOA

      Espero que hayas podido completar tu ejercicio.

      Saludos y disculpa la tardanza :(

      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.

¿Qué es un Enterprise Service Bus y por qué usarlo?