¿Cómo hacer que en OBPM 11g un proceso pueda correlacionar llamadas a Servicios?

Etiquetas de Technorati: ,,,,
En Oracle BPEL PM es muy simple poder hacer un Proceso que tenga una llamada Intermedia, a través de la cual una Aplicación externa se pueda comunicar con él.
Esto para esos casos típicos en donde tu Proceso BPEL, debe esperar a que alguien lo "despierte", en base a un mensaje que venga de una Aplicación Externa.
En este tipo de escenarios es muy útil el uso de Correlation Sets/Ids. Que es un feature que ha existido desde el primer release de Oracle BPEL (2004). Bien, para poder hacer algo similar en OBPM 11g, todo indica que no hay una manera tan directa haciendo uso de las Actividades, si no que toca hacer uso de la infraestrucutra SOA, para poder llevar a cabo este objetivo.
En sí, se reduce a tener un Proceso BPEL Async que tenga justamente un contrato (WSDL) en el cual haya otro operación - llamémosle midCall -- en la cual se quede él esperando la llamada de la Aplicación Externa, y que justamente le conteste al proceso BPM.
El proceso BPM a su vez, debe arrancar a dicho proceso BPEL, y después quedarse esperando (llamada Asíncrona), a que él le conteste, una vez haya sido "despertado" por la llamada, y correlacionado los valores a través de los Correlations Sets/Ids.
Aquí explico cómo realizar esto:

Lo primero es crear una Aplicación de Tipo BPM. Tal como se muestra en la siguiente imagen.
BPMCorrel1
Vamos a crear un Composite basándonos en el Template de BPM.
BPMCorrel2
Se utilizará el siguiente Esquema de XML para arrancar al Proceso. Este mismo nos servirá para el proceso BPEL, y el Mediator.
BPMCorrel0
Con este esquema se definirán los Argumentos de Entrada y de Salida del Proceso. Por ejemplo, en la siguiente imagen aparece cómo se escoge la Salida:
BPMCorrel4
Así quedará la Entrada:
BPMCorrel5
Y la salida:
BPMCorrel6
Una vez con el Proceso abierto, haz dos clicks en la Actividad Start, para poder hacer una asignación de datos Simple:
BPMCorrel7
Vas a crear una Variable del mismo tipo (Argumentos), su nombre será procVar,  para así mapear la Entrada del Proceso,  y poder hacer uso de esos valores a lo largo del mismo:
BPMCorrel8
La Asociación quedará de la siguiente manera:
BPMCorrel9
Por el momento, vamos a dejar al proceso BPM hasta este punto. Vamos a crear un proceso BPEL. Así que ve al composite.xml para agregar un Componente de tipo BPEL:
BPMCorrel10
El Proceso BPEL, créalo de la siguiente manera. Con los siguientes párametros. Fíjate que usará el mismo XSD, donde el Input y el Output los vamos a dejar idénticos:
BPMCorrel11
Fíjate, también, que el Proceso BPEL lo estamos creando sin exponer una Interface SOAP. Esto es opcional, pues podríamos exponerlo como SOAP, y no necesariamente utilizar el Mediator para hacer la llamada a la Operación Media. Pero en este caso sí se usará el Mediator (ver mas adelante), para mantenerlo mas purísticamente, y para facilitar la llamada desde la Aplicación Externa (One Way Operation).
Una vez que le des click en el botón OK a la pantalla anterior, lo que debes hacer es agregar la operación Media. En este caso se llamará “mid”. Esta es la que nos servirá para hacer detener al proceso BPEL, y esperar a la Aplicación Externa. De manera que abre el WSDL del Proceso BPEL, y agrega una operacíón, asocia su mensaje con el mismo de la operación “process”. Es decir “Argumentos”.
BPMCorrel12
Abre el Proceso BPEL en el Designer, y agrega una actividad de “Receive”, y apúntala a la operación “mid”. Tal como aparece en la imagen:
BPMCorrel13
Después, haz dos click en el primer Receive del BPEL Process, para agregar un Correlation Set/Id. Este Correlation ID nos servirá para arrancar la Correlación, con un elemento en específico. Después , en el segundo Receive, se creará un segundo Correlation ID, para que haga match con el primero, y de ésta manera Correlacionar la llamada de la Aplicación externa, y poder hacer que el proceso avance, y le conteste al BPM Process.
Aquí está cómo debe quedar el Correlation ID. No olvides crear la Propiedad:
BPMCorrel14
Después la siguiente Pantalla te debe quedar así:
BPMCorrel15
Y finalmente, en la Columna “Initiate”, escoge “Yes”, pues así haremos que la Correlación arranque:
BPMCorrel16
En el segundo Receive, debes agregar una 2nda Correlación, con la diferencia de que el Initiate debe ir en “No”, y debes agregar la primera, para que justamente haga match. El elemento a utilizar, lo sacas de la Variable creada para dicho Receive:
BPMCorrel17
Finalmente, para terminar lo necesario en el BPEL, necesitas agregar un Assign, para enviar los datos que vienen de la llamada Media, a partir de la Aplicación Externa, hacia el Output del BPEL Process:
BPMCorrel18
Ahora, vamos a agregar un Componente de Mediator a nuestro Composite. Este nos servirá para justamente exponer una Interface SOAP, la cual utilizará la Aplicación Externa para contestarle al proceso BPM. Lo expondremos como un “One Way Operation”, haciendo uso del Esquema que hemos venido utilizando:
BPMCorrel19
Ahora escoge – únicamente – el argumento de entrada, dando click en el engrane:
BPMCorrel20
El Composite debe lucir como la siguiente imagen, y tendrás que relacionar el Mediator con el Proceso BPEL:
BPMCorrel21
Cuando termines de relacionarlos, te saldrá la siguiente pantalla, y escogerás la Operación “mid”.  Pues justamente es la que ocuparemos para contestarle al Proceso:
BPMCorrel22
Da click en OK, y después dos clicks al Mediator, para realizar una asignación de valores. Es decir, lo que entre al Mediator, y lo que le pasaremos al Proceso BPEL:
BPMCorrel23

El Assign quedará así:
BPMCorrel24

El static Routing quedará así:
BPMCorrel25
Hasta el momento, lo que hemos logrado es tener:

  1. Un proceso BPEL que nos ayudará a correlacionar las llamadas desde el proceso BPM, y desde la Aplicación Externa
  2. Un Mediator que tiene una operación de una Sola Via, que permite recibir la llamada desde una Aplicación Externa, y que entregará el mensaje a BPEL, que ya tiene lo necesario para Correlacionar.
Ahora lo que falta es modificar al proceso BPM, para que agregue dos actividades:
  1. Un Throw, que se implemente como llamada  a un Servicio (nuestro proceso BPEL)
  2. Un Catch, que justamente reciba el resultado del Proceso BPEL, una vez que haya recibido el mensaje de la Aplicación Externa, a partir de la llamada Media
Por lo tanto arrastra un Throw Event, en medio del Start y el End, y configúralo de la siguiente manera. Fíjate en escoger la Operación “process” y no “mid”. Pues lo que queremos es justamente arrancar al proceso BPEL, para que él nos ayude a correlacionar la llamada:
BPMCorrel26
Lo que falta de esta actividad es configurar las Asociaciones. Esta es de la Variable de Proceso, hacia BPEL, entregándole el mensaje.
image
Ahora agrega un Catch, después del Throw. Este nos servirá para esperar la respuesta Asíncrona de BPEL. La implementación es Message, la Conversación es “Continues”. Y justamente continuará de la actividad ThrowEvent.
BPMCorrel27
La Asociación debe quedar de la siguiente manera, para ello , crea una nueva Variable, de tipo Argumentos:
BPMCorrel28
El proceso BPM quedará así:
BPMCorrel29
El composite, así:
BPMCorrel30
Compila el Proyecto, debes tener esto en el Log:
BPMCorrel31
Ve al Fusion Middleware Control , ubica tu Composite:
BPMCorrel32
El composite quedó expuesto con 2 interfaces, uno para arrancar al Proceso BPM, y otra para el Mediator. Para arrancar al BPM, y mantenerlo esperando una llamada externa, usemos la interface Process:
BPMCorrel33
Usa la forma que se genera automáticamente para ingresar los datos. Pon atención que el dato que uses como Entrada, es el que servirá para correlacionar. Típicamente se debe definir un campo en el contrato, que sea único-irrepetible, para que se pueda generar la correlación. Este caso será “12”:
BPMCorrel34
Abre la pantalla de Trace, y verás que el Composite se arrancó, que el BPM también, y que el BPEL process de igual manera:
BPMCorrel35
Da click en el BPEL process,  y luego en Flow, para que veas en qué punto se encuentra parado el BPEL process. Igualmente puedes hacerlo para BPM:
BPMCorrel36
Hasta este punto, el proceso BPM se arrancó, y se encuentra esperando. Si una aplicación externa tuviera que regresarle un mensaje, tendría que contestarle a través de nuestro Servicio de Mediator. 
Para poder probar cómo se lleva a cabo la Correlación, regresa a la página de Test del Composite. Pero ahora usa la operación del Mediator, e ingresa el mismo valor que usamos para arrancar al BPM:
BPMCorrel37

BPMCorrel38
Da click en el Trace Flow y verás no únicamente la llamada hacia el Mediator, sino al BPEL también, e inclusive al BPM. Logrando así correlacionar la llamada:
BPMCorrel39
Finalmente fíjate cómo se ejecutó todo el composite:
BPMCorrel40
Se generó una instancia de cada componente.