如何为每个用户创建一个ThreadPoolExecutor?

3

我有一个需求,需要为每个租户创建一个 ThreadPoolExecutor。同时,我正在使用 Spring 提供的 @Async 注释,但是它适用于整个应用程序。因此,如果服务器忙于处理一个租户,它将影响其他用户的租户。 @Async 配置了 ThreadPoolExecutor,但是该线程池对所有用户都是公共的。

编辑: 我需要为每个租户创建一个线程池。 简单来说,我需要为一组用户共享线程池。该组中的所有用户都可以使用同一个线程池。

如何在现有的Java API中实现呢?请帮助。

如何为租户分离出ThreadPool? 例如:租户1被分配了20个线程,那么该组中的所有用户(U1、U2等)都可以使用该线程池,而不会影响其他租户。 租户2也是这样,它将被分配一些20个线程...


4
你们期望有多少用户?因为如果用户量太大,情况会迅速恶化。 - mwarren
1
如果单个 用户A 的线程池使用了所有可用的资源(CPU、RAM、文件系统等),则每个其他用户仍然必须等待,直到 用户A 的任务完成并释放资源。 - Lino
我已经编辑了这个问题。我需要它用于包含用户的租户。我们有多个租户,用户在其中执行大量处理。 - Asif Ansari
1个回答

0

不讨论它是否是一个“好的需求” - 非常简单:

  1. (在自定义类中扩展ThreadPoolTaskExecutor并...)将其添加为@SessionScope @Bean到您的应用程序上下文中。
  2. 使用它。(在控制器中通过@Async注释)

例如:

import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.SessionScope;

@Component
@SessionScope
public class MyThreadPoolExecutor extends ThreadPoolTaskExecutor {

   // only for test-/debuging
   static volatile int cnt = 0;

   public MyThreadPoolExecutor() {
      // only for test-/debuging
      System.out.format("MyThreadPoolExecutor#%d%n", cnt++);
   }
}

在一个简单的控制器中使用它,如下所示:

@Async // !
@GetMapping("/hello")
@ResponseBody
public Future<String> hello() {
    return new AsyncResult("Hello");
}

当我使用一个新的隐身浏览器/会话/用户时,我会得到MyThreadPoolExecutor日志记录。


不需要创建自定义扩展。只需编写一个 @Bean 方法来创建会话作用域的 bean。 - M. Deinum
我已经编辑了我的问题。好的...但是你怎样将线程池分享给用户组? - Asif Ansari
这是一个更复杂的要求,因为在Spring中没有预定义的“租户范围”。 - xerx593
请点击以下链接查看与编程相关的内容:https://www.baeldung.com/spring-custom-scope!;)(猜猜他们如何命名他们的“自定义作用域”!?) - xerx593
通常认为覆盖 Web-aware 范围是一种不好的做法。然而,你需要的是一个“扩展的 SessionScope”,它根据会话/用户解析租户...其余部分可以按原样工作。 - xerx593
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接