reactive-programming - 有条件的两个 Mono 的组合

标签 reactive-programming spring-webflux project-reactor

我想合并两个结果 Mono基于某种条件。两者 MonoWebClient 的结果调用:

  • 第一个是期望快速响应的单个调用。
  • 第二个是响应缓慢的多个调用的组合。

  • “取消”第二个想法Mono如果第一个结果满足某些条件以节省时间并避免不必要的网络调用。如果第一个的Mono结果不够zip它与第二个 Mono .

    一个 Kotlin 代码示例来解释我的想法:
    fun getResult(): Mono<Result> {
    
        val trivialResultMono: Mono<Result> = webClient.getResult()
    
        val nonTrivialResultMono: Mono<Result> = webClient
                .getResult()
                .flatMap { webClient.getResult1(it) }
                .flatMap { webClient.getResult2(it) }
                .flatMap { webClient.getResult2(it) }
    
        //here I need to check if trivial result satisfies some condition,
        //for example trivialResult.size > 5 if it's true I just return
        //trivialResultMono from getResult() function, 
        //it it's false something like this:
        return Mono.zip(trivialResultMono, nonTrivialResultMono) { trivialResult, nonTrivialResult ->
            trivialResult + nonTrivialResult
        }
    
    }
    

    更新:

    为了更清楚,我们假设 trivialResult 在 1 秒内出现,nonTrivialResult 在 2 秒内出现。我想在 trivialResult.size > 5 的情况下在 1 秒内得到我的最终结果否则在 2 秒内。

    仅使用 Mono.zip(trivialResultMono, nonTrivialResultMono)我总是会在 2 秒内得到我的最终结果。

    使用 filter + switchIfEmpty如果 trivialResult.size > 5 需要 1 秒否则为 3 秒。如果我错了,请纠正我。

    最佳答案

    您可以过滤您的 trivialResultMono并申请 switchIfEmpty运算符(operator)

    return trivialResultMono
            .filter(trivialResult -> trivialResult.size > 5)
            .switchIfEmpty(Mono.zip(...))
    

    更新 merge方法:
    Mono<Result> zipResultMono = Mono.zip...
    
    return Flux.merge(
            trivialResultMono.map(trivialResult -> Tuples.of(1, trivialResult)),
            zipResultMono.map(zipResult -> Tuples.of(2, zipResult)))
            .filter(tuple ->
                    (tuple.getT1().equals(1) && tuple.getT2().size > 5) ||
                            tuple.getT1().equals(2))
            .next()
            .map(Tuple2::getT2);
    

    如果 zipResult 的大小总是大于 5,您可以跳过转换为 Tuple2

    关于reactive-programming - 有条件的两个 Mono 的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56148491/

    相关文章:

    javascript - 我可以通过引用编辑vue数据吗?

    reactive-programming - Flow API 是否正在取代 Observer 和 Observable

    java - 订阅 MailChimp 列表 : Content Type '' not supported

    spring-webflux - 获取 web 客户端 web-flux 的响应时间

    rx-java - debounce、throttleFirst 和throttleLast 的 Flux 等效项是什么

    java - Mono::然后返回 null

    java - Spring Boot Data Rest不支持响应式?

    java - 如果 Maybe 完成,则从其他来源将 Maybe 转换为 Single

    java - 使用 mongo 响应式(Reactive) Spring 检查 Webflux 数据

    java - 如果我们已经有 subscribe() 了,我们真的需要 doOnNext() 吗?