我想添加一些代码来模拟WebClient调用中的延迟,这样我就可以确保超时/重试等正常工作。
由于WebClient是被动的并且使用线程池,因此Thread.sleep
似乎会以WebClient在实际使用中通常不会被阻止的方式来阻止线程。
有没有更好的方法来模拟这种延迟?
(灵感来自https://github.com/fletchgqc/chaos-monkey-spring-boot/pull/2/files#diff-7f7c533cc2b344aa04484a17d0eff0da404a5ab3cc55a47bba9ed019fba82e3R9
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));
};