Проблемы типа поиска Reactor CacheMono Kotlin - PullRequest
1 голос
/ 06 августа 2020

У меня есть проект, в котором я использую 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)

Помощь приветствуется.

...