Saltar a contenido

Anotaciones

Parametros de anotaciones

Las anotaciones especificas y @TentacolousListener(...) comparten la misma configuracion de listener.

Parametro Requerido Descripcion
entity Si Clase de entidad que representa la tabla y recibe el payload deserializado.
action Solo para @TentacolousListener ActionListener.INSERT, ActionListener.UPDATE o ActionListener.DELETE.
entityName No Nombre logico del evento. Si se omite, Tentacolous usa el nombre simple de la clase.
field Solo con filtros Campo del payload que se quiere comparar.
valueType Solo con filtros Tipo usado para interpretar value.
value Solo con filtros Valor esperado, siempre escrito como texto.
filter No Bean de Spring que extiende TentacolousFilter<T>. Reemplaza el filtro declarativo.
order No Orden de ejecucion del listener. Los valores menores se ejecutan primero; el valor por defecto es 0.
exclude No Columnas que no deben almacenarse en el payload del evento.

Orden de listeners

Usa order cuando varios listeners procesan la misma entidad y operacion. El orden funciona entre anotaciones especificas y genericas.

@UponUpdating(entity = Person.class, order = 10)
public void updateProfile(Person person) {
}

@TentacolousListener(
    entity = Person.class,
    action = ActionListener.UPDATE,
    order = 20
)
public void registerAudit(Person person) {
}

Si un listener falla, los siguientes no se ejecutan y el evento sigue el flujo normal de reintentos. Los efectos de los listeners deben ser idempotentes.

Sobre entityName

La mayoria de las veces no necesitas entityName. Por defecto, @UponInserting(entity = Person.class) usa Person. Ese valor se almacena en db_change_event.entity_name y se usa internamente para relacionar eventos con listeners.

Usa entityName solo en casos avanzados donde necesites un nombre logico estable, por ejemplo cuando infraestructura externa ya escribe eventos con un nombre especifico.

Sobre exclude

exclude no filtra listeners. Evita que columnas especificas se almacenen en el payload JSON del evento.

@UponInserting(
    entity = User.class,
    exclude = {"password", "token", "secret_key"}
)
public void onUserInserted(User user) {
}

Esto importa porque la tabla de eventos puede contener datos de negocio. Normalmente no quieres guardar secretos ahi.