jtk*_*rce 5 asynchronous servlet-3.0 spring-boot
当我遇到这个问题时,我正在尝试使用 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;
}
Run Code Online (Sandbox Code Playgroud)
然后我将异步线程池配置为也从 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;
}
Run Code Online (Sandbox Code Playgroud)
当我提交 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 Service Unavailable at 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) at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:641) at 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)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)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,问题似乎不会发生。有人可以对这种行为有所了解吗?
| 归档时间: |
|
| 查看次数: |
1746 次 |
| 最近记录: |