反应堆。 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
}
我看那个很难看
是否有任何其他方法可以在 Mono 失败时重试调用,而无需手动执行?
它在每个项目上设置块是否是获得所有项目的正确方法?
如何让代码变得更好?
谢谢。
我相信有 2 位运营商可以帮助您:
对于 "wait for all Mono
" 用例,查看静态方法 when
和 zip
.
when
只关心完成,所以即使单声道为空,只要所有单声道都完成,它也会发出 onComplete
信号。但是您没有得到数据。
zip
关心价值 并期望所有 Monos 都被重视 。当所有 Monos 都被赋值后,它会根据传递的 Function
组合它们的值。否则它只会空着。
要重试空 Mono
s,请查看 repeatWhenEmpty
。它重新订阅一个空的 Mono
,因此如果 Mono
是 "cold",它将重新启动源(例如,发出另一个 HTTP 请求)。
我有列表 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
}
我看那个很难看
是否有任何其他方法可以在 Mono 失败时重试调用,而无需手动执行?
它在每个项目上设置块是否是获得所有项目的正确方法?
如何让代码变得更好?
谢谢。
我相信有 2 位运营商可以帮助您:
对于 "wait for all
Mono
" 用例,查看静态方法when
和zip
.when
只关心完成,所以即使单声道为空,只要所有单声道都完成,它也会发出onComplete
信号。但是您没有得到数据。zip
关心价值 并期望所有 Monos 都被重视 。当所有 Monos 都被赋值后,它会根据传递的Function
组合它们的值。否则它只会空着。
要重试空
Mono
s,请查看repeatWhenEmpty
。它重新订阅一个空的Mono
,因此如果Mono
是 "cold",它将重新启动源(例如,发出另一个 HTTP 请求)。