当我遇到这个问题时,我正在尝试使用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] DEBUG 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)at java.util.concurrent.FutureTask.get(FutureTask.java:192)at 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)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511) 在java.util.concurrent.FutureTask.run(FutureTask.java:266)at 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,则似乎不会发生问题。有人可以对这种行为有所了解吗?