我应该在 spring 控制器中为每个请求创建执行器服务吗?



我正在尝试构建一个 rest API 控制器,它将主机名列表作为输入和在每个主机名中执行的命令

@RequestMapping("/tasks")
public Result execute(@RequestParam(value="hostList") List<HostName> hosts, String command) {
//1. Execute the command in each hostname asynchronously and get completable future.
//2. Get a list of completable future for each hostname command execution
//3. Wait for them to complete and then compose the result
}

问题是,步骤 1 需要针对每个主机名异步进行。 我计划为每个请求创建一个执行器服务(线程池大小为 hosts.size(((,然后在该线程池中执行步骤 1。

但我认为为每个请求创建执行器是一个坏主意,因为这会消耗大量内存。

这是正确的前进方向,还是春天内置了一些东西来处理这种情况。

请注意,房东名单可以从1到20不等

不,没有理由为每个请求创建新的执行程序。你应该有一个执行器,当你的请求出现时,你的代码应该创建一些可运行的任务并将它们提交给执行器。同样在您的情况下,由于您正在谈论在不同的主机上运行某些命令,这意味着您不会在服务器上运行任何命令。您以某种方式向相关主机发送了一条消息,其中包含要执行的命令。(我假设通过队列(。因此,即使您愿意,您的命令也无法同步执行,因为每个命令都在不同的主机上执行。因此,显然它们不能在同一进程中运行,更不用说同一线程了。因此,在您的情况下,您可能根本不需要任何执行人。

没有理由为每个请求创建一个新线程。您可以让执行程序创建固定大小为 N 的线程池,也可以在用于满足 HTTP 请求的 Tomcat/任何其他提供程序线程上提交任务。我在下面给出了两个可能适用于您的一个用例的解决方案

以下解决方案适用于您希望客户端等待其命令提交到其主机的情况

您应该向主机发送消息以执行命令(可能通过 REST API 或其他任何方式(,并等待这些任务执行或提交:这完全取决于您的使用案例。

以下解决方案适用于您希望能够对命令进行排队的情况

您可以将任务提交到创建的线程池,该线程池将按 FI-FO 顺序执行您的任务。 根据您的用例,您可以在线程池中使用 1 个或多个(不要太多线程,因为这只会降低您的整体性能(线程。然后,从队列中选取这些任务时将执行这些任务。

最新更新