【问题标题】:Reactive repository only works with block()反应式存储库仅适用于 block()
【发布时间】: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


【解决方案1】:

是我弄错了范式。问题出在我的坚持方法上。我把它改成了这个,它起作用了:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2022-12-17
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    相关资源
    最近更新 更多