jtkSource
jtkSource

Reputation: 685

SpringBoot Async requests throwing 503 Service Unavailable

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

Answers (1)

Achraf Betach
Achraf Betach

Reputation: 1

This can be helpful

@Configuration
@EnableWebMvc
public class AdapterConfig implements WebMvcConfigurer {
    @Override
    public  void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        configurer.setDefaultTimeout(3600000);
    }
}

Upvotes: 0

Related Questions