反应式存储库只适用于block()。

问题描述 投票:0回答:1

我有一个Spring引导应用程序。作为它的一部分,我应该跟踪一个简单的对象ActiveVersion,它有两个字段,类型和版本。我将这个对象同时持久化在redis和mongo中。ActiveVersionCacheRepository是一个反应式的redis仓库(使用reactiveRedisTemplate),ActiveVersionRepository是一个反应式的mongo仓库.这是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)
}

我的问题是,当我调试测试方法,并一步一步地在ide中评估持久化行与块方法,如: activeVersionCacheRepository.save(activeVersion.type, activeVersion).block() 活动版本确实被持久化在redis中。但是当我不使用block方法评估代码时(或者仅仅通过运行测试而不调试),没有任何东西被保存在redis中。我是反应式编程的新手,所以也许我在switchIfEmpty或其他地方遗漏了什么。

kotlin reactive-programming project-reactor
1个回答
1
投票

这是我把范式弄错了。问题出在我的persist方法上。我把它改成了这个,然后就成功了。

fun persist(activeVersion: ActiveVersion): Mono<ActiveVersion> {
    return activeVersionCacheRepository.save(activeVersion.type, activeVersion).then(
        activeVersionRepository.save(activeVersion)
    )
}
© www.soinside.com 2019 - 2024. All rights reserved.