如何使用 Spring WebClient 正确模拟延迟

问题描述

我想在我的 WebClient 调用添加模拟延迟的代码,以便我可以确保我的超时/重试/等工作正常。

由于 WebClient 是响应式的并使用线程池,因此 Thread.sleep 似乎会以 WebClient 在实际使用中通常不会被阻塞的方式阻塞线程。

有没有更好的方法来模拟这种延迟?

(灵感来自Tkinter: AttributeError: NoneType object has no attribute

public class LatencyInducingRequestInterceptor implements ClientHttpRequestInterceptor {

  public ClientHttpResponse intercept(
      HttpRequest request,byte[] body,ClientHttpRequestExecution execution) throws IOException {
    ClientHttpResponse response = execution.execute(request,body);

    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      // do nothing
    }

    return response;
  }
}

解决方法

答案是使用 delayElement(我在上面发布的代码用于 RestTemplate,这解释了为什么使用 Thread.sleep

  ExchangeFilterFunction latencyAddingFilterFunction =
      (clientRequest,nextFilter) -> {
        return nextFilter.exchange(clientRequest).delayElement(Duration.ofSeconds(2));
      };