gpt4 book ai didi

java - Spring 启动: Can we have seperate thread pool for each request?

转载 作者:行者123 更新时间:2023-12-01 19:04:03 24 4
gpt4 key购买 nike

我已经使用 Spring Boot @Async 为应用程序中的方法实现了异步执行。我有一个包含 20 个线程的自定义线程池。在 for 循环中调用 async 方法 30 次。

每个单独的请求都是异步执行的,但是当我从浏览器同时向我的 API 发出两个不同的请求时,第一个请求正在执行,然后是第二个请求。并非两个请求并行执行相同的方法。

我认为当第一个请求到达应用程序时,它开始执行异步方法,并且由于它已执行 30 次并且我的池有 20 个线程,因此所有线程都忙于执行第一个请求。因此,即使第二个请求来执行,由于线程池繁忙,另一个请求也会等待,直到池中的线程空闲。

我们可以为每个单独的请求拥有单独的线程池吗?或者我们可以使每个请求的执行独立于其他请求处理的任何方式。

这是我的代码示例。

@SpringBootApplication
@EnableAsync
public class AppBootStrap
{
public static void main(String[] args)
{
SpringApplication.run(AppBootStrap.class, args);
}

@Bean
public AsyncTaskService asyncTaskService() {
return new AsyncTaskService();
}

@Bean(name="customExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor poolExecutor = new ThreadPoolTaskExecutor();
poolExecutor.setCorePoolSize(10);
poolExecutor.setMaxPoolSize(20);
poolExecutor.setThreadNamePrefix("customPoolExecutor");
poolExecutor.initialize();
return poolExecutor;
}
}

**Controller Class:**

@RestController
public class TaskController
{
@Autowired
private TaskService taskService;

@RequestMapping("/performAction")
public void performAction() {
taskService.performAction();
}
}

**Service class**

@Service
public class TaskService
{
@Autowired
private AsyncTaskService asyncTaskService;

public void performAction()
{
for(int i = 0; i < 30; i++) {
asyncTaskService.greetings(i);
}
}
}

**Async Method Class**

public class AsyncTaskService
{
@Async
public void greetings(Integer i)
{
try
{
Thread.sleep(500 * (i + 10));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("Welcome to Async Service: " + i);
}
}

最佳答案

    @Bean(name = "apiTaskExecutor")
public ThreadPoolTaskExecutor apiTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(20);
executor.setMaxPoolSize(100);
executor.setQueueCapacity(50);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}

@Bean(name = "lruTaskExecutor")
public ThreadPoolTaskExecutor lruTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(100);
executor.setMaxPoolSize(200);
executor.setQueueCapacity(500);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}

执行此操作的方法是使用不同的限定符名称创建两个线程不同的线程池。 (如上图)

    @Autowired
@Qualifier("apiTaskExecutor")
private ThreadPoolTaskExecutor apiTaskExecutor;

然后使用您提供的限定符 Autowiring 所需的池。您还可以使用 @Async 注释来代替 Autowiring 。我更喜欢这种方式。

如果我没记错的话,这种为不同任务使用不同线程池的方式被称为舱壁模式。

关于java - Spring 启动: Can we have seperate thread pool for each request?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59589087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com