Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建多个Spring@restcontroller,每个都有自己的线程池?_Java_Spring Mvc_Tomcat_Servlets - Fatal编程技术网

Java 如何创建多个Spring@restcontroller,每个都有自己的线程池?

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

我有一个使用TomcatWebservlet的SpringRESTful服务,它处理2种不同类型的数据,因此每种类型的数据都有2个rest控制器。控制器#1有可能使用大量内存执行密集型任务,因此我希望在此控制器上最多允许10个连接。但如果所有10个连接都在控制器#1上处理,我还希望控制器#2拥有自己的线程池,以便它可以在控制器#1已满时继续处理

配置Tomcat的正确方法是在application.yml中设置其属性,如spring文档中所述。 要设置最大连接的总数,请使用:

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无法为您提供任何信息。