Spring Boot异步方法内调用Feign Client出现阻塞无响应问题求助
问题根因
- @Async默认线程池不合理:Spring @Async默认使用
SimpleAsyncTaskExecutor,不会复用线程,高并发下会创建大量线程,且如果出现阻塞调用会快速耗尽线程资源,后续异步任务直接排队无法执行 - Feign超时未配置:你使用了指定固定url的FeignClient,不会走负载均衡组件的超时配置,默认Feign读取超时时间为60s,部分版本甚至为无限等待,远端服务响应慢或异常时会导致Feign调用一直阻塞,占住异步线程
- Future调用无超时控制:代码中调用
future.get()未设置超时时间,只要异步线程阻塞,主线程就会同步等待,最终导致整个业务逻辑卡死 - Feign日志级别未开启:Feign默认日志级别为
NONE,不会输出任何请求、响应明细,因此无法看到调用日志 - 代码笔误:异步方法返回
AsyncResult时传入了ReportResponse类而非查询到的response对象,会直接导致编译/运行异常,需优先修正
修复方案
- 自定义@Async线程池,替换默认实现,配置合理的线程数、队列长度和拒绝策略,避免线程无限创建:
@Configuration @EnableAsync public class AsyncThreadPoolConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 根据业务实际并发调整参数 executor.setCorePoolSize(10); executor.setMaxPoolSize(20); executor.setQueueCapacity(100); executor.setThreadNamePrefix("feign-async-thread-"); // 拒绝策略可根据业务调整,CallerRunsPolicy为拒绝后由提交任务的线程执行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } }
- 配置Feign超时和日志级别,在application.yml中添加如下配置:
feign: client: config: # 可以指定为你的FeignClient的name(此处为service),default代表所有FeignClient生效 default: connectTimeout: 3000 # 连接超时3s readTimeout: 5000 # 读取超时5s,根据业务实际响应时长调整 loggerLevel: FULL # 输出完整请求响应日志 # 可选:启用okhttp连接池,替换默认的JDK URLConnection,提升并发性能 okhttp: enabled: true
如果选择启用okhttp,需要额外添加依赖:
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-okhttp</artifactId> </dependency>
- 给
Future.get()添加超时控制,避免无限等待:
for (Future<ReportResponse> future : futuresList) { try { // 超时时间设置比Feign readTimeout稍长即可 ReportResponse response = future.get(6, TimeUnit.SECONDS); } catch (TimeoutException e) { log.error("调用超时", e); // 超时后主动取消异步任务 future.cancel(true); } catch (Exception e) { log.error("调用异常", e); } }
- 修正异步方法的返回值笔误:
@Async public Future<ReportResponse> getId(String id) { ReportResponse response = client.getReport(id); log.info("resp for {}", response); // 传入实际返回的response对象,而非类名 return new AsyncResult<>(response); }
内容的提问来源于stack exchange,提问作者Sefas
相关产品推荐
相关产品推荐

