Как добавить условие для метода «retry» в kotlin и webflux, когда api возвращает данные об ошибке? - PullRequest
0 голосов
/ 24 октября 2019

Как изменить параметры с помощью retry() в kotlin и webflux?

Существует функция productInfo, параметр функции представляет собой набор идентификаторов продуктов.

Когда я ввожу неправильный идентификатор в идентификаторы коллекции списков, вышестоящий интерфейс будет возвращать только неправильный идентификатор. И получить сбой.

Чего я хочу добиться, так это когда вышестоящий интерфейс возвращает неверный идентификатор. Информация о продукте может удалить неправильный идентификатор и повторить попытку с правильными идентификаторами.

Я пытался использовать 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 голосов
/ 28 октября 2019

То, что вы хотите, не retry(). Я построил решение, делая небольшие предположения здесь и там. Вы можете обратиться к этому решению и внести изменения в соответствии с вашими требованиями. Я использовал рекурсию здесь (productInfo()). Вы можете заменить рекурсивный вызов веб-клиентским вызовом, если ошибка возникает только один раз.

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)
            }
        }
}
...