hace 3 años
En el mundo de la modelización de procesos de negocio con BPMN (Business Process Model and Notation), a menudo nos encontramos con situaciones donde necesitamos no solo ejecutar tareas, sino también tener un plan para deshacer o revertir esas tareas si las circunstancias cambian. Aquí es donde entran en juego las actividades de compensación. Estas actividades son herramientas esenciales para asegurar la robustez y flexibilidad de nuestros procesos, permitiéndonos corregir el rumbo cuando algo sale inesperadamente o cuando las decisiones iniciales ya no son válidas.

- ¿Qué es una Actividad de Compensación en BPMN?
- ¿Cómo Funciona la Compensación en BPMN?
- Ámbito de la Compensación: ¿A Qué Actividades Afecta?
- Disparando la Compensación: Eventos de Lanzamiento y Referencia a Actividades
- Compensación y Subprocesos de Evento
- Ejemplos de Uso de Actividades de Compensación
- Puntos Clave sobre Actividades de Compensación
- Preguntas Frecuentes (FAQs) sobre Actividades de Compensación en BPMN
¿Qué es una Actividad de Compensación en BPMN?
Una actividad de compensación en BPMN es, en esencia, un mecanismo para revertir los efectos de una actividad que ya se ha completado con éxito. Imagina un proceso de reserva de hotel. Si el cliente cancela la reserva después de que se haya confirmado y procesado el pago, necesitamos una forma de deshacer esas acciones: cancelar la reserva en el sistema del hotel, reembolsar el pago, y quizás notificar al hotel la cancelación. Estas acciones de "deshacer" son precisamente lo que modelamos con actividades de compensación.

En términos más técnicos, una actividad de compensación se define en relación a otra actividad principal. Para indicar que una actividad puede requerir compensación, se le adjunta un evento de límite de compensación. Este evento de límite no es directamente la actividad de compensación, sino el detonante que la activará bajo ciertas condiciones. La verdadera actividad que realiza la compensación, el proceso que ejecuta las acciones de reversión, se llama manejador de compensación. Este manejador es una actividad especial marcada con un marcador de compensación, indicando su propósito.
¿Cómo Funciona la Compensación en BPMN?
El flujo de compensación en BPMN se activa típicamente cuando el proceso alcanza un evento de lanzamiento intermedio de compensación o un evento final de compensación. Consideremos un ejemplo sencillo para ilustrar el proceso:
Supongamos que tenemos una tarea de servicio llamada "Tarea A" que, por ejemplo, reserva un producto en un inventario. Después de que la "Tarea A" se completa con éxito, el proceso continúa. En algún punto del flujo, llegamos a un evento de lanzamiento intermedio de compensación. Este evento actúa como un disparador. Al alcanzarlo, BPMN busca en el ámbito actual actividades que hayan tenido un evento de límite de compensación adjunto y que ya se hayan completado exitosamente. En nuestro caso, si la "Tarea A" tiene un evento de límite de compensación asociado, se activará el manejador de compensación correspondiente a la "Tarea A".
Este manejador de compensación, que podríamos llamar "Deshacer A", contendría las tareas necesarias para revertir la acción de "Tarea A", como liberar el producto del inventario. Una vez que el manejador "Deshacer A" se completa, el proceso continúa su flujo normal desde el evento de lanzamiento intermedio de compensación.

Es importante destacar que la compensación no se ejecuta automáticamente después de cada tarea. Debe ser explicitamente activada por un evento de lanzamiento de compensación. Esto nos da control preciso sobre cuándo y cómo se ejecutan las acciones de reversión.
Ámbito de la Compensación: ¿A Qué Actividades Afecta?
Cuando se activa un evento de lanzamiento de compensación (ya sea intermedio o final), la pregunta clave es: ¿qué actividades dentro del proceso son candidatas a ser compensadas? Las reglas de ámbito en BPMN definen esto claramente:
- Actividades Completadas en el Mismo Ámbito: La compensación se aplica a todas las actividades que se hayan completado con éxito dentro del mismo ámbito del evento de lanzamiento de compensación. Actividades que estén aún activas o que hayan terminado por error o cancelación no se compensan.
- Subprocesos Embebidos: Si dentro del ámbito del evento de lanzamiento de compensación hay subprocesos embebidos que se hayan completado, también se invocarán los manejadores de compensación dentro de estos subprocesos y subprocesos anidados. Nuevamente, solo si los subprocesos están completados. Si están activos o terminados de otra forma, no se activa la compensación dentro de ellos.
- Subprocesos de Evento: Si el evento de lanzamiento de compensación está dentro de un subproceso de evento embebido, la compensación se limita a las actividades dentro de ese subproceso de evento. No se extenderá a actividades fuera de él en el proceso principal.
- Actividades de Llamada (Call Activities): Un punto crucial es que la compensación no se propaga a los procesos hijos invocados por actividades de llamada. Si una actividad de llamada invoca otro proceso BPMN separado, y queremos compensar acciones dentro de ese proceso hijo, debemos modelar explícitamente la compensación en el proceso padre, adjuntando un evento de límite de compensación a la actividad de llamada en sí. De esta manera, el manejador de compensación de la actividad de llamada se encargaría de iniciar la compensación en el proceso hijo, si fuera necesario. La compensación se detiene en el límite de la actividad de llamada.
- Actividades Multi-Instancia: Para una actividad multi-instancia, incluso si se han ejecutado múltiples instancias de la actividad principal, el manejador de compensación se invoca solo una vez. Es responsabilidad del manejador de compensación revertir los efectos de *todas* las instancias de la actividad multi-instancia. Si se necesita una compensación por instancia individual, el propio manejador de compensación puede ser modelado también como multi-instancia. La compensación solo se activa si *todas* las instancias de la actividad multi-instancia se han completado.
Disparando la Compensación: Eventos de Lanzamiento y Referencia a Actividades
Como hemos mencionado, la compensación se dispara mediante eventos de lanzamiento de compensación. Existen dos tipos principales:
- Evento de Lanzamiento Intermedio de Compensación: Se coloca en el flujo del proceso cuando en un punto intermedio se necesita activar la compensación.
- Evento Final de Compensación: Se coloca al final del flujo si la compensación debe ocurrir como parte del cierre del proceso (aunque es menos común).
Por defecto, un evento de lanzamiento de compensación invoca todos los manejadores de compensación dentro de su ámbito. Sin embargo, BPMN también ofrece la posibilidad de ser más selectivos y especificar la actividad exacta que se debe compensar. Esto se logra mediante la propiedad `activityRef` en el evento de lanzamiento de compensación. Al establecer `activityRef` a una actividad específica (que debe tener un evento de límite de compensación y estar en el mismo ámbito), solo se invocará el manejador de compensación de esa actividad en particular. Esta capacidad es útil para controlar el orden de la compensación o para escenarios donde solo se necesita revertir una acción específica.
Utilizar `activityRef` nos permite orquestar la compensación de forma más precisa y, en algunos casos, puede ser crucial para mantener la consistencia y el orden correcto de las operaciones de reversión.
Compensación y Subprocesos de Evento
Los subprocesos de evento en BPMN, ya sean interruptores o no interruptores, también pueden interactuar con la compensación. Pueden contener eventos de lanzamiento de compensación (intermedios o finales). Estos eventos de compensación dentro de un subproceso de evento pueden, a su vez:
- Referenciar una actividad específica para compensar, utilizando `activityRef`, como ya hemos visto.
- Emitir la compensación a todo el ámbito exterior del subproceso de evento. En este caso, la compensación se comportará como un evento de lanzamiento de compensación normal en el ámbito que contiene el subproceso de evento, buscando actividades completadas con eventos de límite de compensación en ese ámbito más amplio.
Una combinación poderosa es usar subprocesos de evento, especialmente los subprocesos de evento de error, junto con la compensación. Imaginemos un proceso donde, en caso de ocurrir un error irrecuperable (modelado con un evento de error), queremos no solo detener el proceso normal, sino también revertir las acciones que ya se hayan realizado. Un subproceso de evento de error puede capturar el error, y dentro de él, podemos colocar un evento de lanzamiento de compensación para deshacer los pasos previos. Esto permite implementar patrones robustos de manejo de errores y rollback en nuestros procesos BPMN.

Ejemplos de Uso de Actividades de Compensación
Las actividades de compensación son útiles en una variedad de escenarios, algunos ejemplos comunes incluyen:
- Transacciones Financieras: En procesos que involucran pagos o transferencias de dinero, la compensación es crucial para manejar cancelaciones, reembolsos, o errores en la transacción. Si un pago falla después de haber reservado un producto, la compensación puede deshacer la reserva.
- Gestión de Inventario: Como en nuestro ejemplo anterior, al reservar o asignar recursos del inventario, la compensación permite liberar esos recursos si la reserva se cancela o expira.
- Procesos de Reserva y Cita: En sistemas de reserva de hoteles, vuelos, citas médicas, etc., la compensación se utiliza para cancelar reservas y liberar recursos cuando es necesario.
- Procesos de Aprovisionamiento y Desaprovisionamiento de Servicios: Al activar o desactivar servicios para un cliente, la compensación puede deshacer la activación si la solicitud se revierte o si hay un error en la configuración.
- Procesos de Registro y Baja de Usuarios: Si un usuario se registra en un sistema y luego decide darse de baja, la compensación puede revertir el proceso de registro, eliminando la cuenta y cualquier configuración asociada.
Puntos Clave sobre Actividades de Compensación
Para resumir y reforzar los conceptos clave sobre actividades de compensación en BPMN:
- Las actividades de compensación se utilizan para revertir acciones completadas con éxito.
- Se activan explícitamente mediante eventos de lanzamiento de compensación (intermedios o finales).
- Se definen en relación a una actividad principal mediante un evento de límite de compensación y un manejador de compensación.
- La compensación opera dentro de un ámbito definido, afectando actividades completadas en ese ámbito, incluyendo subprocesos embebidos (pero no procesos hijos de actividades de llamada).
- Se puede especificar una actividad particular para compensar mediante la propiedad `activityRef`.
- Son especialmente útiles en combinación con subprocesos de evento de error para implementar robustos mecanismos de manejo de errores y rollback.
Preguntas Frecuentes (FAQs) sobre Actividades de Compensación en BPMN
- ¿Cuál es la diferencia entre un evento de límite de compensación y un manejador de compensación?
El evento de límite de compensación se adjunta a la actividad principal y actúa como un marcador que indica que esta actividad *puede* requerir compensación. El manejador de compensación es la actividad real que ejecuta las acciones para revertir la actividad principal. El evento de límite es el *qué*, el manejador es el *cómo*.
- ¿Cuándo se ejecuta un manejador de compensación?
Un manejador de compensación no se ejecuta automáticamente después de cada actividad. Se ejecuta solo cuando un evento de lanzamiento de compensación (intermedio o final) es alcanzado en el flujo del proceso y ese evento activa la compensación para la actividad principal a la que está asociado el manejador.
- ¿Qué ocurre si una actividad no tiene un evento de límite de compensación adjunto?
Si una actividad no tiene un evento de límite de compensación, no será candidata a ser compensada. Incluso si se lanza un evento de compensación en su ámbito, su manejador de compensación no será invocado (simplemente porque no existe).

Compensation events assist with undoing steps that were already successfully completed in the case that their results are no longer desired and need to be reversed. To revert the effects of an activity, a compensation boundary event is attached to the activity. This activity is called compensation activity. - ¿Puedo tener múltiples manejadores de compensación para una misma actividad?
No, para cada actividad principal, solo puede haber un único evento de límite de compensación y, por lo tanto, un único manejador de compensación asociado.
- ¿En qué se diferencian las actividades de compensación de las actividades de error?
Las actividades de error se utilizan para manejar situaciones excepcionales o fallos en el proceso. Las actividades de compensación, en cambio, se utilizan para revertir acciones que *se completaron con éxito* pero que, por alguna razón posterior, ya no son deseadas. Error maneja fallos, compensación deshace éxitos.
En conclusión, las actividades de compensación son una herramienta poderosa y esencial en BPMN para construir procesos robustos y flexibles. Permiten gestionar escenarios donde se necesita deshacer acciones previas, asegurando la consistencia y la corrección de los procesos de negocio incluso ante cambios o errores. Dominar el uso de la compensación es clave para modelar procesos empresariales complejos y resilientes.
