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á.