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

问题描述 投票:0回答:1

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

asynchronous spring-boot servlet-3.0
1个回答
0
投票

这可能会有帮助

@Configuration
@EnableWebMvc
public class AdapterConfig implements WebMvcConfigurer {
    @Override
    public  void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        configurer.setDefaultTimeout(3600000);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.