Реактивный репозиторий работает только с block () - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть загрузочное приложение Spring. Как часть этого, я должен отслеживать простой объект ActiveVersion, который имеет два поля, тип и версию. Я сохраняю этот объект в Redis и Mon go. ActiveVersionCacheRepository - это реактивный репозиторий Redis (используя реактивныйRedisTemplate), а ActiveVersionRepository - реактивный репозиторий mon go. Это часть ActiveVersionService. Методы для извлечения и сохранения activeVersion:

fun getActiveVersion(type: String): Mono<ActiveVersion> {
        return activeVersionCacheRepository.findByKey(type)
                .switchIfEmpty(
                        Mono.defer{activeVersionRepository.findByType(type)}
                ).switchIfEmpty(
                        Mono.defer{persist(ActiveVersion(type,1))}
                )
    }

fun persist(activeVersion: ActiveVersion): Mono<ActiveVersion> {
    activeVersionCacheRepository.save(activeVersion.type, activeVersion)
    return activeVersionRepository.save(activeVersion)
}

Это мой метод тестирования:

@Test
fun getNewActiveVersion(){
    var activeVersion = activeVersionService.getActiveVersion("newDummy").block()
    assertEquals(activeVersion?.version,1)
}

Моя проблема заключается в том, когда я отлаживаю метод тестирования и go шаг за шагом в идеале и оцените постоянные строки с помощью блочного метода, такого как: activeVersionCacheRepository.save(activeVersion.type, activeVersion).block() активная версия действительно сохраняется в redis. Но когда я просто go просматривал код без оценки с помощью блока (или просто запустив тест без отладки), ничего не сохранялось в redis. Я новичок в реактивном программировании, поэтому, возможно, я что-то упустил в switchIfEmpty или где-то еще.

1 Ответ

1 голос
/ 27 апреля 2020

Это была моя неправильная парадигма. Проблема была с моим постоянным методом. Я изменил это на это, и это сработало:

fun persist(activeVersion: ActiveVersion): Mono<ActiveVersion> {
    return activeVersionCacheRepository.save(activeVersion.type, activeVersion).then(
        activeVersionRepository.save(activeVersion)
    )
}
...