如何创建多个具有各自线程池的Spring @RestControllers?

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

我有一个使用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

但是,这将配置两个控制器组合在一起的整个应用程序的最大连接数/线程数。我需要每个控制器都有自己的线程池和最大数量的连接。这可能吗?

java spring-mvc tomcat servlets
1个回答
2
投票

你不能*。 Spring Boot设置了一个嵌入式Tomcat Servlet容器并注册了一个DispatcherServlet。整个Tomcat线程池用于处理通过DispatcherServlet(或注册的任何其他servlet /过滤器)的所有请求。

*您应该为每种数据类型创建一个ThreadPoolTaskExecutorExecutorService 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并保持自己的计数。一旦达到阈值,就可以直接发送适当的响应,而无需启动任何业务逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.