Spring Boot中CompletableFuture超时后,异步线程池工作线程状态如何?
异步请求超时后工作线程是否继续执行?
我有一个Spring Boot应用,正在以异步方式发送多个请求。以下是相关代码和问题:
TaskExecutor配置
@Bean(name = "someWorkExecutor") public TaskExecutor afterPlayTriggersExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(10); executor.setThreadNamePrefix("OtherThreadD-"); executor.setAwaitTerminationMillis(3000); executor.initialize(); return executor; }
异步服务实现
@Slf4j @Service @RequiredArgsConstructor public class MyAsynService { @Async("someWorkExecutor") public CompletableFuture<MyApiResponse> asyncCall(...) { return CompletableFuture.completedFuture(callFeignClient(...,...)); } }
调用方代码
@Slf4j @Service public class ClientService { // .... public ClientResponse execute(....) { int atLeast = 500; // 发送相同请求至少500次 CompletableFuture<MyApiResponse>[] asyncCallResponses = new CompletableFuture[atLeast]; for (int index = 0; index < atLeast; index ++) { asyncCallResponses[index] = myAsynService.asyncCall(); } final List<OtherResponseType> dump = getResponseAsyncThreads(asyncCallResponses); // ... } private List<OtherResponseType> getResponseAsyncThreads(CompletableFuture<MyApiResponse>[] asyncCallResponses) { try { CompletableFuture.allOf(asyncCallResponses).get(5000, TimeUnit.MILLISECONDS); } catch (InterruptedException | ExecutionException | TimeoutException ex) { // 即使出现异常,someWorkExecutor中的其他工作线程会继续执行吗? } // .... } }
问题解答
当CompletableFuture.allOf(...).get(5000, TimeUnit.MILLISECONDS)触发TimeoutException时,正在执行REST请求的工作线程不会立即停止,会继续完成任务。
原因是:get(timeout)方法只是主线程在等待异步任务结果时触发超时返回,它不会向工作线程发送任何中断信号。你的工作线程正在执行callFeignClient发送请求的逻辑,这个过程会持续到请求完成(成功或失败),除非你主动调用CompletableFuture.cancel(true)来尝试中断线程。
如果需要在超时后终止未完成的工作线程,你可以遍历所有asyncCallResponses,调用future.cancel(true)。不过要注意,这只是向线程发送中断信号,具体是否能终止请求取决于Feign底层使用的HTTP客户端是否响应线程中断。
内容的提问来源于stack exchange,提问作者monstereo
相关产品推荐
相关产品推荐

