Antes de entrar en el mecanismo de correlación de mensajes, hagamos una pequeña comprobación. Necesitas duplicar el diagrama anterior (PP08b) y hacer las modificaciones que comentamos a continuación.
Cambia el nombre de los procesos a RECLAMAR y RESPONDER
Añade un actor a RESPONDER (recuerda configurarlo al grupo /acme)
Asegúrate de que la senda de RESPONDER está asignada al actor anterior.
Cambia la tarea de RESPONDER a "humana".
La tarea que hemos modificado —ahora la hemos llamado "responder reclamación"— va a pedirnos que seamos nosotros los que rellenemos la variable bResponde. Para eso, necesitamos un contrato y un formulario. No tenemos variable de negocio, así que simplemente añadimos al contrato una entrada de tipo TEXT.
frespuesta - TEXT
En las operaciones, modificamos la que tenemos del ejercicio anterior, eliminando el resultado de la derecha, y seleccionando del desplegable la entrada de contrato frespuesta.
Para conseguir que el formulario nos muestre la información que nos ha llegado por mensaje necesitamos añadir 2 variables —cuando lo hayamos generado y estemos editándolo—:
vQuien -- External API -- ../API/bpm/caseVariable/{{task.caseId}}/bQuien
vReclamacion -- External API -- ../API/bpm/caseVariable/{{task.caseId}}/bReclamacion
Estas variables las podemos utilizar en sendos widgets Input, haciéndolos de solo lectura y especificando en valor vQuien.value y vReclamacion.value respectivamente. Cómo acceder a las variables de proceso en un formulario lo tienes algo más detallado en la página Paso a Paso/Atajando.
Comprueba que funciona ejecutando RECLAMAR.
Cuando hayamos comprobado que los procesos trabajan como esperamos, vamos a hacer otra prueba. Ejecutaremos RECLAMAR dos veces desde la aplicación web de Bonita, en la pestaña "Procesos". Cada vez que pulsemos el inicio del proceso se nos pedirá que escribamos nuestra reclamación. Para comprender mejor lo que ocurrirá, introduce los textos "la primera" y "la segunda" en sendos formularios.
Si vamos a la pestaña de tareas, veremos las dos actividades pendientes ("responder reclamación"). Vamos a resolverlas en orden inverso, empezaremos por la segunda y terminaremos por la primera. Nuevamente, los textos deben darnos una pista de por dónde hemos ido: "respondiendo a la segunda" y "respondiendo a la primera".
Entre una y otra nos aparecerá una tarea pendiente más, la de "leer respuesta". La ignoramos de momento.
Refresca la lista de tareas y comprueba qué ha pasado. Puedes finalizar ambas tareas con un comentario "error de correlación".
Parece que se hayan cruzado las respuestas. Y, efectivamente, así ha sido, el lanzador de mensaje "respuesta enviada" no ha funcionado como esperábamos. El problema es la correlación de instancias. Al iniciar RECLAMAR dos veces, tenemos activas dos instancias del proceso. Además, cada una de ellas ha activado otra instancia de RESPONDER. Hasta aquí, ningún problema.
Lo que ha ocurrido es que no hemos proporcionado información de a qué instancia concreta debe responder "respuesta enviada" en RESPONDER. Sin información de correlación, el mensaje emitido por un lanzador llega al capturador de la instancia más antigua. Por eso, al tomar en primer lugar la tarea "responder reclamación" de la segunda instancia de RESPONDER, el mensaje ha llegado a la primera instancia de RECLAMAR.
¿Cómo conseguimos que el mensaje llegue a la instancia correcta?
Queremos conseguir que el mensaje responda a la instancia de RECLAMAR que ha "llamado" a RESPONDER. O, dicho de otra forma, responder al remitente del mensaje. Para ello vamos utilizar una clave de correlación.
Cada ejecución de RECLAMAR —cada instancia— generará una clave única que enviara junto con los demás datos en el mensaje de "enviada reclamación". RESPONDER utilizará esa clave en el lanzador "respuesta enviada" para localizar al remitente correcto. Pero, ¿cómo creamos esa clave y configuramos esos lanzadores de mensaje?
En realidad, esta clave puede ser cualquier cosa, y puede ser más de una, todo depende de los procesos que estemos manejando y cómo podemos encontrar la instancia correcta. En nuestro caso, es evidente que el remitente del primer mensaje se queda esperando a que el destinatario le responda. Con el identificador de instancia de proceso nos es suficiente. Cada vez que iniciamos un proceso se genera un identificador único de instancia —los números marcados en la imagen adyacente—. De hecho, los hemos estado viendo en todos nuestros ejercicios al examinar los casos.
Veamos, a continuación, qué necesitamos para conseguir trabajar con esos identificadores.
Crear una variable de proceso en RECLAMAR
Con el proceso RECLAMAR seleccionado, nos vamos a Datos/Variable de proceso y agregamos una variable de proceso.
clavecorr (LONG)
Antes de cerrar el diálogo, debemos entrar en la edición del valor predeterminado.
Podemos valernos del panel izquierdo para encontrar lo que buscamos en Contexto de Ejecución/apiAccessor. Elegimos —o escribimos directamente en el editor— processInstanceId
Enviar la clave a RESPONDER
Editamos el mensaje "mm" del evento "enviada reclamación", y añadimos un nuevo contenido vinculado al valor de la variable clavecorr, eligiéndola desde el desplegable en la columna "valor".
dllamador --> clavecorr
Asegúrate de que la correlación está desactivada. En la pestaña de "correlación entre instancias", que "use la correlación por clave" esté desmarcado.
En este primer mensaje no hace falta correlación, se va crear una instancia nueva de RESPONDER. Dicho de otra forma, el destinatario del mensaje no existe todavía, precisamente vamos a crearlo al iniciar una nueva instancia de este proceso. Solo le estamos enviando la clave para que pueda utilizarla cuando envíe su respuesta a nuestra reclamación.
RESPONDER recibirá el mensaje en el evento de inicio "recibida reclamación". Hay que actualizar el contenido a leer por dicho evento y almacenarlo en una variable.
Crea una variable de proceso en RESPONDER
bLlamador (LONG)
Actualiza el contenido del mensaje capturado
En el evento de mensaje de inicio de RESPONDER, añade un dato más utilizando las listas desplegables que te aparecen.
bLlamador -- toma valor de -- dllamador
Cuando RESPONDER se inicie por la llegada del mensaje, guardará la clave de correlación en la variable bLlamador.
Correlación entre instancias - respuesta enviada
Este evento lanzador de mensaje debe enviarlo a la instancia identificada por la clave de correlación. Como clave de correlación, vinculada al valor de la variable de proceso bLlamador, añadimos
corrB - bLlamador
Correlación entre instancias - respuesta recibida
Ahora en RECLAMAR, para el evento de captura de mensaje "respuesta recibida", añadimos
corrB - clavecorr
Recuerda que clavecorr es la variable de proceso donde hemos almacenado el identificador de instancia al principio de esta sección. Lo que acabamos de hacer es obligar al capturador de mensaje a comparar la clave que le ha llegado en el mensaje (corrB) con lo que se almacenó en un primer momento en RECLAMAR (clavecorr). Evidentemente, han de coincidir ambos valores para que el mensaje se entregue.
Vuelve a probar el par de reclamaciones anteriores en el mismo orden, respondiendo a "la segunda" reclamación primero y a "la primera" después. Comprueba que ahora sí que han llegado las respuestas a los remitentes correctos.