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
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
· Click derecho sobre la nueva aplicación-New Project-General-Projects-BPEL (el proceso que creamos es asincrónico)
2. Creamos el payload
· Dentro de la carpeta Integration Content, click en Schemas y seleccionar el RegistroSolicitud.xsd
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
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)
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
· 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
· 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
· 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