Wednesday, December 10, 2008

Haciendo un workflow en BPEL

Notas sobre el documento:

· La demo se hizo usando la vmware End2End SOA Order Booking v3.1

· El proyecto lo puedes descargar de aquí

El proceso

clip_image003

Elementos del proceso

· Roles: Solicitante, Gerente

· Payload (Unidad de información): idSolicitud, Nombres, Dirección, fecha de nacimiento, teléfono, usuario

Hagámoslo en BPEL!

1. Crear una nueva aplicación en BPEL –todo el desarrollo de este ejemplo lo hacemos usando Oracel JDeveloper 10.1.3.3.0-

· File-New-General-Applications

clip_image005

· Click derecho sobre la nueva aplicación-New Project-General-Projects-BPEL (el proceso que creamos es asincrónico)

clip_image007

2. Creamos el payload

· Dentro de la carpeta Integration Content, click en Schemas y seleccionar el RegistroSolicitud.xsd

clip_image009

3. Crear las actividades principales que conforman el flujo (Durante los siguientes pasos vamos a revisar estas actividades y complementarlas según la funcionalidad que estamos buscando dentro del flujo). Dentro de estas tareas principales identificamos 3 importantes:

· Registrar la solicitud en la base de datos: Invoke

· El gerente revisa la solicitud: Human Task

· La revisión puede ser para aprobar, rechazar o mandar a corregir: Switch

clip_image011

Outcomes rechazar, aprobar, corregir
Parameters Element-RegistroSolicitud.xsd-RegistroSolicitudProcessRequest
Assignment Label: Gerente
By expression-dynamic user xpath: Functions-Identity Service Functions- getManager(/task:task/task:payload/ns0:RegistroSolicitudProcessRequest/ns0:usuario)

clip_image013

4. Ahora necesitamos complementar el flujo que hicimos implementando los servicios necesarios para que la conexión a la base de datos funcione

· Obtener el ID de la solicitud en la base de datos: invoke a un servicio en la DB

· Seleccionar Database Adapter

· Execute Custom SQL: select tform100_seq.nextval id_solicitud from dual

· Conectar el invoke con el servicio

· Registrar la solicitud en la base de datos: Para esto necesitamos copiar los datos que vamos a insertar (assign) y crear un servicio que inserte los datos en la DB (invoke), esto se debe hacer cada vez que el solicitante cree una nueva solicitud o la corrija, es por esto que necesitamos crear una variable booleana que nos permita controlar el registro en la base de datos.

· Crear una variable global booleana que controle el registro en la DB

clip_image015

· Crear un assign que inicialice la variable booleana a true y el id de la solicitud que viene del output del invoke obtenerIdSolicitud con el input del payload

clip_image017

· Crear un while que encapsule el proceso de registrar solicitud a la DB cada vez que el boolean este en true, dentro de este while se haría:

o Un invoke a la DB que permita insertar o hacer update de datos en la tabla donde guardamos la información de la solicitud (todo lo que va a la DB es lo que queda guardado en el input del assign que se hará a continuación)

o Un assign donde se copian los datos a insertar: id, usuario, nombres, estado, fecha. La fecha la conseguimos en expression-dateFunctions-currentDateTime

clip_image019

· Crear un assign que al finalizar el registro en la DB actualice el boolean a false

5. Ahora trabajaremos cada una de las opciones que puede tomar el gerente: la de rechazar, la de aprobar y la de corregir. En este paso haremos la de rechazar:

· Crear un servicio a la DB que actualice el estado (un update)

· Crear un assign en donde este el input del servicio al cual le asignemos el id de la solicitud y el nuevo estado

· Crear una actividad Email

· To: DeprecatedIDService-getUserProperty(usuario, mail)

· Body:Solicitud rechazada

6. Aprobar

· Crear un servicio a la DB que actualice el estado (un update)

· Crear un assign en donde este el input del servicio al cual le asignemos el id de la solicitud, el nuevo estado

· Crear un servicio a la DB que ingrese el cobro con la información de la solicitud: id, importe, fecha de aprobación

· Crear el assign para que el input del servicio tenga los datos necesarios

7. Corregir

· Crear un servicio a la DB que actualice el estado (un update)

· Crear un assign en donde este el input del servicio al cual le asignemos el id de la solicitud, el nuevo estado

· Crear un human task para la corrección de la solicitud

· Outcomes: Finalizar

· Parameters: RegistroSolicitud.xsd

·Assignement: /task:task/task:payload/ns0:RegistroSolicitudProcessRequest/ns0:usuario

· Crear un assign para poner el booleano en true y el payload del human task de RegistroSolicitud en el inputVariable

clip_image021

No comments: