我有一个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或其他地方遗漏了什么。
这是我把范式弄错了。问题出在我的persist方法上。我把它改成了这个,然后就成功了。
fun persist(activeVersion: ActiveVersion): Mono<ActiveVersion> {
return activeVersionCacheRepository.save(activeVersion.type, activeVersion).then(
activeVersionRepository.save(activeVersion)
)
}