Saltar al contenido

Spring Webflux y @Cacheable: forma adecuada de almacenar en caché el resultado del tipo Mono / Flux

Solución:

Hackear camino

Por ahora, no hay una integración fluida de @Cacheable con Reactor 3. Sin embargo, puede omitir esa cosa agregando .cache() operador para regresar Mono

@Repository
interface TaskRepository : ReactiveMongoRepository<Task, String>

@Service
class TaskService(val taskRepository: TaskRepository) {

    @Cacheable("tasks")
    fun get(id: String): Mono<Task> = taskRepository.findById(id).cache()
}

Ese cortar a tajos caché y recurso compartido devuelto de taskRepository datos. A su vez, Spring cacheable almacenará en caché una referencia de devuelto Mono y luego, devolverá esa referencia. En otras palabras, es un caché de mono que contiene el caché :).

Manera de los complementos del reactor

Hay una adición a Reactor 3 que permite una integración fluida con cachés en memoria modernos como cafeína, jcache, etc. Usando esa técnica, podrá almacenar en caché sus datos fácilmente:

@Repository
interface TaskRepository : ReactiveMongoRepository<Task, String>

@Service
class TaskService(val taskRepository: TaskRepository) {

    @Autowire
    CacheManager manager;


    fun get(id: String): Mono<Task> = CacheMono.lookup(reader(), id)
                                               .onCacheMissResume(() -> taskRepository.findById(id))
                                               .andWriteWith(writer());

    fun reader(): CacheMono.MonoCacheReader<String, Task> = key -> Mono.<Signal<Task>>justOrEmpty((Signal) manager.getCache("tasks").get(key).get())
    fun writer(): CacheMono.MonoCacheWriter<String, Task> = (key, value) -> Mono.fromRunnable(() -> manager.getCache("tasks").put(key, value));
} 

Nota: Los complementos de Reactor almacenan en caché su propia abstracción, que es Signal<T>, así que no te preocupes por eso y siguiendo esa convención

He usado la solución hacky de Oleh Dokuka que funcionó muy bien, pero hay una trampa. Debe usar una duración mayor en la caché de flujo que el valor de tiempo de duración de las cachés en caché. Si no utiliza una duración para la caché de Flux, no la invalidará (la documentación de Flux dice “Convierta este Flux en una fuente activa y almacene en caché las últimas señales emitidas para más suscriptores”). Por lo tanto, hacer que la caché de Flux sea de 2 minutos y un tiempo de duración de 30 segundos puede ser una configuración válida. Si el tiempo de espera de ehcahce se agota primero, se genera una nueva referencia de caché de flujo y se utilizará.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *