首页 > 解决方案 > WebClient 使用 ExchangeFilterFunctions 将处理程序添加到 Mono

问题描述

我想知道是否将向从 ExchangeFilterFunction 返回的 Mono 添加功能将应用于返回的最终 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();

我的问题是我是否可以移出其中的一些逻辑,例如错误处理和可能重试逻辑以及对 ExchangeFilterFunctions 的附加日志记录,如果我这样做,它们在放入 Flux 时仍然会被应用吗?

同样在 ExchangeFilterFunctions 中,我如何能够访问 SubscriberContext,因为在记录时我们需要的上下文中有数据,例如用于跟踪的请求的唯一 ID。

标签: javaspring-bootspring-webfluxspring-webclient

解决方案


错误处理逻辑肯定可以分离出来,这篇 Baeldung文章对此很有帮助

另外,我建议重构您的代码,以免有任何嵌套的地图/平面地图。这将使您的代码更具可读性,并且可能会引导您了解应该提取哪些部分。这篇文章很好地涵盖了这一点


推荐阅读