当我遇到这个问题时,我正在尝试 springboots 异步控制器。 我通过设置以下内容将 servlet 容器的线程数设置为 10
@Bean
public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory(@Value("${server.port:8080}") final String port,
@Value("${jetty.threadPool.maxThreads:10}") final String maxThreads,
@Value("${jetty.threadPool.minThreads:8}") final String minThreads,
@Value("${jetty.threadPool.idleTimeout:60000}") final String idleTimeout) {
final JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory(Integer.valueOf(port));
factory.addServerCustomizers(new JettyServerCustomizer() {
@Override
public void customize(final Server server) {
final QueuedThreadPool threadPool = server.getBean(QueuedThreadPool.class);
threadPool.setMaxThreads(Integer.valueOf(maxThreads));
threadPool.setMinThreads(Integer.valueOf(minThreads));
threadPool.setIdleTimeout(Integer.valueOf(idleTimeout));
}
});
return factory;
}
然后,我将异步线程池配置为也从 10 开始,但将最大线程池大小设置为 200。
@Bean
public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(200);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("asyncthread-");
executor.initialize();
return executor;
}
当我提交 20 个并发请求时,我在客户端代码上始终收到以下错误。服务器端似乎没有显示任何问题。
08:06:12.550 [pool-1-thread-1] 调试 org.springframework.web.client.RestTemplate - GET 请求 “http://localhost:8080/time/basicasync”导致 503(服务 不可用);调用错误处理程序 java.util.concurrent.ExecutionException: org.springframework.web.client.HttpServerErrorException:503服务 无法提供于 java.util.concurrent.FutureTask.report(FutureTask.java:122) 在 java.util.concurrent.FutureTask.get(FutureTask.java:192) 在 Main.main(Main.java:64) 原因: org.springframework.web.client.HttpServerErrorException:503服务 无法提供于 org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94) 在 org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:641) 在 org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:597) 在 org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557) 在 org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:289) 在 Main.lambda$main$1(Main.java:32) 处 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 处 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:748)
我的客户端代码挂起,因为我使用 CompletionService 提交所有任务。如果我将服务器上的异步线程池增加到 50,则问题似乎不会发生。有人可以解释一下这种行为吗?
这可能会有帮助
@Configuration
@EnableWebMvc
public class AdapterConfig implements WebMvcConfigurer {
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
configurer.setDefaultTimeout(3600000);
}
}