WebClient, добавляющий обработчики в Mono с помощью ExchangeFilterFunctions - PullRequest
0 голосов
/ 05 августа 2020

Мне интересно, будет ли добавление функциональности к Mono, которое я возвращаю из ExchangeFilterFunction, применяться к последнему возвращаемому Mono. По сути, я хочу очистить часть своего клиентского кода, переместив некоторые проблемы из клиентского класса в ExchangeFilterFunctions, которые я могу добавить клиенту, но мой случай немного отличается от одного вызова.

В основном у меня есть что-то похожее на приведенный ниже код:

    Flux.fromIterable(uris)
        .parallel()
        .runOn(Schedulers.parallel())
        .flatMap(uri -> webClient.get()
            .uri(uri)
            .headers(headers -> headers.addAll(httpHeaders))
            .retrieve()
            .onStatus(
                status -> status.is4xxClientError() || status.is5xxServerError(),
                response -> response.bodyToMono(String.class)
                    .map(body -> new MyCustomException(body, response.statusCode())))
            .bodyToMono(MyResponse.class)
            .map(x -> Tuple.of(x, null))                
            .onErrorMap(ReadTimeoutException.class, th ->
                new MyCustomException(ErrorResponseBuilder.buildError(th), HttpStatus.INTERNAL_SERVER_ERROR)))
        .doOnEach(this::log)
        .sequential();

Мой вопрос: могу ли я переместить некоторые из этих c logi, например, обработку ошибок и, возможно, повторить logi c и дополнительное ведение журнала к ExchangeFilterFunctions вместо этого, и если я это сделаю, будут ли они по-прежнему применяться при помещении в Flux?

Также в ExchangeFilterFunctions, как я смогу получить доступ к SubscriberContext, потому что есть данные в контексте, который нам нужен при регистрации, например уникальный идентификатор запроса, который используется для трассировки.

1 Ответ

0 голосов
/ 05 августа 2020

Лог обработки ошибок c определенно можно было бы разделить, эта статья Baeldung очень полезна, чтобы помочь с этим

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

...