WebClient调用降级至Java 8的SpringBoot API时阻塞超时,但RestTemplate可正常调用的问题排查求助
WebClient调用降级至Java 8的SpringBoot API时阻塞超时,但RestTemplate可正常调用的问题排查求助
大家好,我遇到一个奇怪的问题,想请各位帮忙排查一下:
问题背景
原本我们有一套基于Java 21 + SpringBoot的API服务,运行正常且Java 21的消费者调用无问题。后来因为消费者限制必须用Java 8,我们把API降级到了Java 8 + SpringBoot 2.3.12版本。现在消费者用WebClient调用该API时,执行block()方法会一直挂起,添加超时配置后触发了TimeoutException,但用RestTemplate调用同一个接口却能正常拿到响应,API端的Controller和Repository日志也显示请求已正常处理完成并返回。
环境与依赖配置
- 消费者与API服务的Java版本:8
- API服务SpringBoot版本:2.3.12
- 消费者端Spring WebFlux依赖:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webflux</artifactId> <version>5.3.39</version> </dependency>
- WebClient初始化代码:
WebClient.builder().baseUrl("http://172.22.35.203:8081").build();
完整WebClient调用代码
我添加了超时和错误监听后的调用代码如下:
webClient .get() .uri(uri) .headers(httpHeaders -> setHeaders(httpHeaders, headers)) .retrieve() .onStatus( status -> !status.is2xxSuccessful(), clientResponse -> clientResponse .bodyToMono(ErrorResponse.class) .flatMap( response -> Mono.error( new CustomServiceException( clientResponse.statusCode(), response)))) .bodyToMono(responseType) .timeout(Duration.ofMillis(30000)) .doOnError(error -> System.out.println("Error signal detected: " + error)) .block();
触发的错误信息
超时后抛出的异常如下:
Exception thrown from webclient: java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 30000ms in 'flatMap' (and no fallback has been configured) reactor.core.Exceptions$ReactiveException: java.util.concurrent.TimeoutException: Did not observe any item or terminal signal within 30000ms in 'flatMap' (and no fallback has been configured)
已完成的排查动作
- 用Postman调用该API接口,能快速拿到正常响应
- 用RestTemplate调用相同接口,可正常获取响应,代码示例:
restTemplate.getForEntity("http://172.22.35.203:8081/v1/customer/search?firstName=MVYHFPQDNH&lastName=BSGWUDKCOUVE&alwaysWildcardAccountNumber=false", String.class).getBody()
- 检查API服务端日志,Controller和Repository层均无异常,确认请求已处理完成并返回响应
- 原API在Java 21环境时,用相同的WebClient调用逻辑完全正常
求助问题
想请教各位:
- 可能导致Java 8环境下WebClient调用
block()超时,但RestTemplate正常的原因有哪些? - 有哪些有效的调试手段可以进一步定位具体的阻塞点?
内容来源于stack exchange




