Reputation: 685
I was experimenting with springboots async controllers when I came around with this issue. I set the number of threads for the servlet container to 10 by setting the following
@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;
}
I then configured the async thread pool to also start with 10 but set the max thread poolsize to 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;
}
When I submit 20 concurrent requests I get the below error consistently on the client code. The server side doesn't seem to show any issues.
08:06:12.550 [pool-1-thread-1] DEBUG org.springframework.web.client.RestTemplate - GET request for "http://localhost:8080/time/basicasync" resulted in 503 (Service Unavailable); invoking error handler java.util.concurrent.ExecutionException: org.springframework.web.client.HttpServerErrorException: 503 Service Unavailable at java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.util.concurrent.FutureTask.get(FutureTask.java:192) at Main.main(Main.java:64) Caused by: org.springframework.web.client.HttpServerErrorException: 503 Service Unavailable at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94) at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:641) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:597) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557) at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:289) at 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) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748)
My Client code hangs because I use CompletionService to submit all tasks. If I increase the async threadpool on the server to 50 the issue doesn't seem to occur. Can someone throw some light on this behavior ?
Upvotes: 5
Views: 3321
Reputation: 1
This can be helpful
@Configuration
@EnableWebMvc
public class AdapterConfig implements WebMvcConfigurer {
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
configurer.setDefaultTimeout(3600000);
}
}
Upvotes: 0