spring-webflux - 在 Mono 上重试似乎会生成一个无限循环
问题描述
我正在尝试学习 Reactor,并创建了以下示例:
fun dbThingErrorSometimes() : Mono<String> {
return if (Random.nextBoolean()){
processDbResult(pooledClient.execute("SELECT * FROM product"))
}else{
Mono.error(RuntimeException("boom"))
}
}
然后我在哪里使用它(在控制器中):
@RequestMapping("/dbpooledretry")
@ResponseBody
fun dbExamplePoolRetrying(): Mono<String> {
return dbService.dbThingErrorSometimes()
.retry()
}
当它出现错误时,它会陷入无限循环(rest call 永远不会返回并且 cpu 会达到 100%)。为什么?
解决方案
您的retry()
方法只是重试由 . 返回的发布者dbService.dbThingErrorSometimes()
,这可能是Mono.error()
. dbService.dbThingErrorSometimes()
永远不会被重新调用,它发出的发布者只会被重新订阅。
因此,如果它确实发出错误,那么重新订阅同一个错误发布者永远不会改变结果,因此你的无限循环。
相反,您可能希望每次重试时都Mono
懒惰地重新调用- 您可以通过将该方法调用包装在.dbService.dbThingErrorSometimes()
Mono.defer()
推荐阅读
- php - 将 JSONObject 添加到特定数组
- session - ASP.NET Core - 会话未保存
- javascript - Jest & React & Typescript & React-Testing-Library 错误
- java - 为什么Java溢出返回0作为值
- ios - Appstore Connect Testflight 提供旧版本,即使我上传了新版本
- c# - 如何创建此动画过渡?
- php - 如何从另一个查询结果运行一个查询。(单级传销倒数)
- nlp - IBM NL Classifier 和 NLU 定制模型分类有什么区别?
- c - C 为什么scanf返回错误的输出
- r - 从需要使用 R 登录的站点中抓取信息(可能使用 API)