【发布时间】:2020-08-10 19:39:10
【问题描述】:
我有一个 Spring Boot 应用程序。作为其中的一部分,我应该跟踪一个简单的对象 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 中持久化。但是当我只是通过代码而不用块评估(或者只是通过运行测试而不是调试)时,没有任何东西保存在redis中。我是响应式编程的新手,所以也许我在 switchIfEmpty 或其他地方遗漏了一些东西。
【问题讨论】:
-
反应流的第一条规则:在你订阅之前什么都不会发生。因此,要触发执行,您需要订阅/阻止。
-
我在测试方法中调用了 block()。想知道为什么它不起作用,至少正如我所期望的那样
-
这可能会有所帮助:stackoverflow.com/a/57877616/6051176
-
是的,确实上面评论中的链接很有帮助
标签: kotlin reactive-programming project-reactor