es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

@Cacheable de Spring: necesidad de conocer si el valor se devuelve desde la caché o no.

Nuestras aplicaciones utilizan Spring Cache y necesitan saber si la respuesta fue devuelta desde la caché O si fue calculada realmente. Estamos buscando agregar una bandera en el HashMap de resultado que lo indique. Sin embargo, cualquier cosa devuelta por el método está en caché, así que no estamos seguros si podemos hacerlo en la implementación del método de cálculo.

¿Hay alguna manera de saber si el método de cálculo fue ejecutado O si el valor devuelto proviene de la caché al llamar al método de cálculo?

Código que estamos utilizando para el método de cálculo –

java
@Cacheable(
cacheNames = "request",
key = "#cacheMapKey",
unless = "#result['ErrorMessage'] != null")
public Map<string, object=""> calculate(Map<string, object=""> cacheMapKey, Map<string, object=""> message) {
// implementación del método
return result;
}
</string,></string,></string,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de saber si se ejecutó el método calculate o si el valor de retorno proviene de la memoria caché al llamar al método calculate.

    Un enfoque consiste en utilizar un Interceptor de Caché y modificar el método calculate para devolver un objeto personalizado que incluya el resultado y una bandera booleana que indique si el resultado se obtuvo de la memoria caché o no. El Interceptor de Caché puede establecer esta bandera en función de si la memoria caché fue acertada o no.

    Aquí hay un ejemplo de cómo se puede implementar:

    @Cacheable(
        cacheNames = "request",
        key = "#cacheMapKey",
        unless = "#result['ErrorMessage'] != null")
    public CacheResult calculate(Map<string, object=""> cacheMapKey, Map<string, object=""> message) {
        // Implementación del método
        Map<string, object=""> result = ...;
    
        // crear el objeto personalizado CacheResult, estableciendo el resultado y la bandera
        return new CacheResult(result, !CacheAspectSupport.currentCacheOperation().isCachePut());
    }
    
    // definir la clase personalizada CacheResult
    public class CacheResult {
        private Map<string, object=""> result;
        private boolean cacheHit;
    
        public CacheResult(Map<string, object=""> result, boolean cacheHit) {
            this.result = result;
            this.cacheHit = cacheHit;
        }
    
        // métodos getter para result y cacheHit
        // ...
    }
    

    Con este enfoque, el método calculate ahora devuelve un objeto personalizado que incluye el resultado y una bandera que indica si el resultado se obtuvo de la memoria caché o no. El Interceptor de Caché ahora puede interceptar la llamada al método y establecer esta bandera en función de si la memoria caché fue acertada o no.

    Aquí hay un ejemplo de cómo se puede implementar el Interceptor de Caché:

    @Aspect
    public class CacheInterceptor implements MethodInterceptor {
        public Object invoke(MethodInvocation invocation) throws Throwable {
            Object result = null;
            boolean cacheHit = false;
    
            // obtener el contexto de la operación de caché
            CacheOperationContext context = CacheAspectSupport.currentContext();
    
            // comprobar si se acertó la memoria caché
            if (context.getOperation().isCacheable() && context.getCaches()[0].get(context.generateKey()) != null) {
                cacheHit = true;
            } else {
                result = invocation.proceed();
            }
    
            // establecer la bandera en el objeto CacheResult devuelto por el método calculate
            if (result instanceof CacheResult) {
                ((CacheResult) result).setCacheHit(cacheHit);
            }
    
            return result;
        }
    }
    

    Con este enfoque, cuando se llama al método calculate, el Interceptor de Caché intercepta la llamada al método y comprueba si se acertó la memoria caché. Si se acertó la memoria caché, establece la bandera en el objeto CacheResult devuelto por el método calculate en verdadero, lo que indica que el resultado se obtuvo de la memoria caché. Si no se acertó la memoria caché, se permite que la llamada al método continúe y el objeto CacheResult devuelto por el método calculate incluye el resultado y una bandera false que indica que el resultado se calculó.</string,></string,></string,></string,></string,>

Comments are closed.