SpringBoot异步请求抛出503服务不可用

时间:2017-07-20 00:14:17

标签: asynchronous spring-boot servlet-3.0

当我遇到这个问题时,我正在尝试使用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,则似乎不会发生问题。有人可以对这种行为有所了解吗?

0 个答案:

没有答案