当api返回错误数据时,如何在kotlin和webflux中为条件“ retry”添加条件?

时间:2019-10-24 06:35:35

标签: kotlin spring-webflux

如何使用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()
            }
    }

1 个答案:

答案 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)
            }
        }
}