如何使用retry()
和kotlin
中的webflux
来更改参数?
有一个productInfo函数,该函数参数是产品ID的集合。
当我在列表集合ID中输入错误的ID时,上游接口将仅返回错误的ID。失败了。
我要实现的是上游接口返回错误的ID时。产品信息可以删除错误的ID,然后尝试使用正确的ID。
我尝试使用 retry(),但是我不知道如何在第二次尝试中更改参数。
fun productInfo(ids: List<Pair<String, String>>): Flux<ProductItem> {
return productWebClient
.get()
.uri("product/items/${ids.joinToString(";") { "${it.second},${it.first}" }}")
.retrieve()
.bodyToFlux(ProductItem::class.java)
.onErrorResume {
logger.error("Fetch products failed." + it.message)
Mono.empty()
}
}
答案 0 :(得分:0)
您想要的不是retry()
。我构建了一个解决方案,在这里和那里做一些小小的假设。您可以参考此解决方案并根据需要进行更改。我在这里使用了递归(productInfo()
)。如果错误仅发生一次,则可以将递归调用替换为webclient调用。
fun productInfo(ids: List<Pair<String, String>>): Flux<ProductItem> {
val idsString = ids.joinToString(";") { "${it.second},${it.first}" }
return webClient
.get()
.uri("product/items/${idsString}")
.exchange()
.flatMapMany { response ->
if (response.statusCode().isError) {
response.body { clientHttpResponse, _ ->
clientHttpResponse.body.cast(String::class.java).collectList()
.flatMapMany<ProductItem> { eids ->
val ids2 = ids.filter { eids.contains("${it.second},${it.first}") }
productInfo(ids2)
}
}
} else {
response.bodyToFlux(ProductItem::class.java)
}
}
}