Java 如何创建多个Spring@restcontroller,每个都有自己的线程池?
我有一个使用TomcatWebservlet的SpringRESTful服务,它处理2种不同类型的数据,因此每种类型的数据都有2个rest控制器。控制器#1有可能使用大量内存执行密集型任务,因此我希望在此控制器上最多允许10个连接。但如果所有10个连接都在控制器#1上处理,我还希望控制器#2拥有自己的线程池,以便它可以在控制器#1已满时继续处理 配置Tomcat的正确方法是在application.yml中设置其属性,如spring文档中所述。 要设置最大连接的总数,请使用:Java 如何创建多个Spring@restcontroller,每个都有自己的线程池?,java,spring-mvc,tomcat,servlets,Java,Spring Mvc,Tomcat,Servlets,我有一个使用TomcatWebservlet的SpringRESTful服务,它处理2种不同类型的数据,因此每种类型的数据都有2个rest控制器。控制器#1有可能使用大量内存执行密集型任务,因此我希望在此控制器上最多允许10个连接。但如果所有10个连接都在控制器#1上处理,我还希望控制器#2拥有自己的线程池,以便它可以在控制器#1已满时继续处理 配置Tomcat的正确方法是在application.yml中设置其属性,如spring文档中所述。 要设置最大连接的总数,请使用: server.to
server.tomcat.max-connections: 10
server.tomcat.max-threads: 10
但是,这将为整个应用程序配置连接/线程的最大数量(两个控制器的组合)。我需要每个控制器都有自己的线程池和自己的最大连接数。这可能吗?你不能*。Spring Boot设置一个嵌入式Tomcat servlet容器并注册一个
DispatcherServlet
。整个Tomcat线程池用于处理通过DispatcherServlet
(或注册的任何其他Servlet/过滤器)的所有请求
*您应该为每种类型的数据创建ThreadPoolTaskExecutor
或ExecutorService
bean,然后将它们适当地注入到@Controller
bean中,并将所有工作分派给它们
@controller
类控制器{
专用最终执行器服务线程池;
公共FirstController(@限定符(“第一类型数据”)ExecutorService线程池){
this.threadPool=threadPool;
}
@请求映射(“/endpoint1”)
公共CompletableFuture handleEndpoint(){
CompletableFuture foo=新的CompletableFuture();
线程池。提交(()->{
//处理所有业务逻辑
foo.完成(…);
});
返回foo;
}
}
SpringMVC“用户空间堆栈”并不真正了解连接。您可以传递
HttpServletRequest
并维护自己的计数。一旦达到阈值,就可以直接发回适当的响应,而无需启动任何业务逻辑 你不能*。Spring Boot设置一个嵌入式Tomcat servlet容器并注册一个DispatcherServlet
。整个Tomcat线程池用于处理通过DispatcherServlet
(或注册的任何其他Servlet/过滤器)的所有请求
*您应该为每种类型的数据创建ThreadPoolTaskExecutor
或ExecutorService
bean,然后将它们适当地注入到@Controller
bean中,并将所有工作分派给它们
@controller
类控制器{
专用最终执行器服务线程池;
公共FirstController(@限定符(“第一类型数据”)ExecutorService线程池){
this.threadPool=threadPool;
}
@请求映射(“/endpoint1”)
公共CompletableFuture handleEndpoint(){
CompletableFuture foo=新的CompletableFuture();
线程池。提交(()->{
//处理所有业务逻辑
foo.完成(…);
});
返回foo;
}
}
SpringMVC“用户空间堆栈”并不真正了解连接。您可以传递
HttpServletRequest
并维护自己的计数。一旦达到阈值,就可以直接发回适当的响应,而无需启动任何业务逻辑 但是,即使我的ExecutorService
已满,它也会接受连接吗?我需要拒绝未来数据类型为#1的连接,直到请求离开ExecutorService
。是否可以创建2个DispatcherServlet,每个DispatcherServlet都有自己的线程池分配给自己的@RestController
?@ChrisLaemmerhirt我不知道您是否看到了我15分钟前的编辑。请刷新,我的地址后的代码结束连接。在这种情况下,多个DispatcherServlet
s无法为您提供任何帮助。但是,即使我的ExecutorService
已满,它也不会接受连接吗?我需要拒绝未来数据类型为#1的连接,直到请求离开ExecutorService
。是否可以创建2个DispatcherServlet,每个DispatcherServlet都有自己的线程池分配给自己的@RestController
?@ChrisLaemmerhirt我不知道您是否看到了我15分钟前的编辑。请刷新,我的地址后的代码结束连接。在这种情况下,多个DispatcherServlets无法为您提供任何信息。