反应堆。 Monos 列表,失败时重试

Reactor. List of Monos, retry on fail

我有列表 List<Mono<String>>。每个 Mono 代表 API 调用,我在 I/O 上等待结果。问题是有时有些调用 return 什么都没有(空字符串),我需要在这种情况下再次重复它们。

现在看起来像这样:

val firstAskForItemsRetrieved = firstAskForItems.map {
    it["statistic"] = (it["statistic"] as Mono<Map<Any, Any>>).block()
    it
}

我正在等待所有 Monos 完成,然后在空体的情况下我重复请求

val secondAskForItem = firstAskForItemsRetrieved
        .map {
            if ((it["statistic"] as Map<Any, Any>).isEmpty()) {
                // repeat request 
                it["statistic"] = getUserItem(userName) // return Mono
            } else
                it["statistic"] = Mono.just(it["statistic"])
            it
        }

然后再次屏蔽每个项目

val secondAskForItemsRetrieved = secondAskForItems.map {
    it["statistic"] = (it["statistic"] as Mono<Map<Any, Any>>).block()
    it
}

我看那个很难看

谢谢。

我相信有 2 位运营商可以帮助您:

  • 对于 "wait for all Mono" 用例,查看静态方法 whenzip.

    • when 只关心完成,所以即使单声道为空,只要所有单声道都完成,它也会发出 onComplete 信号。但是您没有得到数据。
    • zip 关心价值 并期望所有 Monos 都被重视 。当所有 Monos 都被赋值后,它会根据传递的 Function 组合它们的值。否则它只会空着。
  • 要重试空 Monos,请查看 repeatWhenEmpty。它重新订阅一个空的 Mono,因此如果 Mono 是 "cold",它将重新启动源(例如,发出另一个 HTTP 请求)。