【问题标题】:Spring webflux request callback not workingSpring webflux请求回调不起作用
【发布时间】:2020-04-23 20:53:54
【问题描述】:

我正在使用 spring-webflux 5.1.7-RELEASE。我想在发送请求之前触发 webclient 的回调。代码如下:

ExchangeFilterFunction logRequest (SomeLogObject someLogObject) {
    return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
        /**
         business logic for callback goes here
         */
        return Mono.just(clientRequest);
    });
}

//code for plugging in logRequest callback (at some othe place)
WebClient webClient = WebClient
        .builder()
        .clientConnector(new ReactorClientHttpConnector(HttpClient.from(tcpClient)))
        .baseUrl(baseURL)
        .filters(exchangeFilterFunctions -> exchangeFilterFunctions.add(logRequest(someLogObject)))
        .build();

webClient
        .get()
        .uri(uriBuilder -> uriBuilder.path("some_uri_path").queryParams(queryParam).build())
        .header("some_header_key", "some_header_value")
        .retrieve().bodyToMono(String.class);

这里 logRequest 是在开始时触发的(远在触发请求之前)。根据我的调试,我发现它在调用retrieve() 时被触发。

有没有办法确保在发送请求之前立即触发 logRequest,而不是在创建单声道时触发?

提前致谢

【问题讨论】:

  • 你能给个完整的minimal reproducible example吗?我希望logRequest() 会立即被调用,但我希望您标记的“回调业务逻辑”在发出请求时执行,而不是在创建单声道时执行。
  • @MichaelBerry 你是对的 logRequest() 被立即调用。但是在调用retrieve() 方法时也会调用业务逻辑。我想将它延迟到请求执行之前。业务逻辑是一个日志语句。它记录请求开始执行时的时间戳,例如log.info("开始时间是",currtimeinmillis)
  • 我真的不明白你想做什么

标签: spring-webflux project-reactor


【解决方案1】:

我认为您正在寻找以下更改:

ExchangeFilterFunction logRequest (SomeLogObject someLogObject){
    return ExchangeFilterFunction.ofRequestProcessor(clientRequest ->
            Mono.defer(() -> {
                /**
                 business logic for callback goes here
                 */
                return Mono.just(clientRequest);
            })
    );
}

Mono.defer() 将延迟代码执行,直到真正的请求。

【讨论】:

  • 我会试试这个并回复你
  • 我试过这个。 defer 适用于我的情况。我会接受的。
  • 很高兴听到这个消息!
猜你喜欢
  • 2021-06-12
  • 2018-09-24
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 2018-01-08
相关资源
最近更新 更多