我有一个使用Tomcat Web servlet的Spring RESTful服务,该服务处理2种不同类型的数据,因此每种数据类型都有2个rest控制器。控制器1可能会使用大量内存来执行繁重的任务,因此我想在此控制器上最多允许10个连接。但是,如果所有10个连接都在控制器#1上进行处理,我也希望控制器#2具有自己的线程池,以便它可以在控制器#1满时继续处理。
配置Tomcat的正确方法是在spring.docs中的here中在application.yml中设置其属性。要设置一个最大连接总数,请使用:
server.tomcat.max-connections: 10
server.tomcat.max-threads: 10
但是,这将配置两个控制器组合在一起的整个应用程序的最大连接数/线程数。我需要每个控制器都有自己的线程池和最大数量的连接。这可能吗?
你不能*。 Spring Boot设置了一个嵌入式Tomcat Servlet容器并注册了一个DispatcherServlet
。整个Tomcat线程池用于处理通过DispatcherServlet
(或注册的任何其他servlet /过滤器)的所有请求。
*您应该为每种数据类型创建一个ThreadPoolTaskExecutor
或ExecutorService
bean,然后将它们适当地注入到@Controller
bean中,并将所有工作分派给它们。
@Controlller
class FirstController {
private final ExecutorService threadPool;
public FirstController(@Qualifier("first-type-data") ExecutorService threadPool) {
this.threadPool = threadPool;
}
@RequestMapping("/endpoint1")
public CompletableFuture<Foo> handleEndpoint() {
CompletableFuture<Foo> foo = new CompletableFuture<>();
threadPool.submit(() -> {
// handle all your business logic
foo.complete(...);
});
return foo;
}
}
Spring MVC“用户空间堆栈”并不真正了解连接。您可以绕过HttpServletRequest
并保持自己的计数。一旦达到阈值,就可以直接发送适当的响应,而无需启动任何业务逻辑。