У меня есть проект, в котором я использую Reactor с Spring Cloud Gateway (версия Hoxton.SR5). Я хотел реализовать кеш для данных, которые запрашиваются шлюзом из других служб.
Из того, что у меня есть прочтите, аннотации @Cacheable несовместимы с реактором 3.3, поэтому я перешел к CacheMono в сочетании с Caffeine.
Код, который я пытаюсь написать, должен выполнять довольно простую работу:
- Проверить кеш для записи
- Если пропущено, запросить службу
- Создать моно
- После моно-возврата поместите значение в кеш
- Если сработает кеш, просто верните это Mono
Мерзость кода (функция getFromSource
возвращает Mono через Webclient):
var myCache: Cache<String, DomainObject> = Caffeine.newBuilder()
.expireAfterWrite(1, TimeUnit.MINUTES)
.maximumSize(1000)
.build()
fun get(id: String): Mono<DomainObject> {
return CacheMono
.lookup(
{ key ->
Mono
.justOrEmpty(myCache.getIfPresent(key))
.map {s ->
Signal.next(s)
}
},
id
)
.onCacheMissResume {
getFromSource(id)
}
.andWriteWith { (key, signal) ->
Mono.fromRunnable {
Optional
.ofNullable(signal.get())
.ifPresent { value: DomainObject ->
myCache.put(key, value)
}
}
}
}
Он жалуется на следующее:
Type inference failed: fun <KEY : Any!, VALUE : Any!> lookup(p0: (KEY!) -> Mono<Signal<out VALUE!>!>!, p1: KEY): CacheMono.MonoCacheBuilderCacheMiss<KEY!, VALUE!>
cannot be applied to
((String!) -> Mono<Signal<@Nullable DomainObject!>!>,String)
Помощь приветствуется.