当前位置: 首页 > 知识库问答 >
问题:

Spring Boot:我们可以为每个请求设置单独的线程池吗?

翟奇逸
2023-03-14

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

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

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

这是我的代码示例。

@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);
  }
}

共有1个答案

蓝泰平
2023-03-14

我认为问题在于customExecutor bean是一个单例。这意味着当第二个请求尝试使用这个bean时,它会发现thred池中的所有线程都很忙。您可以尝试通过使用@scope(“prototype”)注释来使customExecutor bean不是单例的,每当请求这种类型的bean时,这将导致实例化一个新的bean。

 类似资料:
  • 给stackoverflow社区的人们。我正在寻找一些帮助,以解决HikariCP连接池面临的问题。 高级:我正在尝试使用线程池创建多个线程,我的计划是为每个工作线程提供独立于HikariCP的连接,但HikariCP所做的是在多个线程之间共享一个公共连接。我正在使用 以检索DB连接。现在,当我关闭一个连接时,我在其他线程中看到问题,说连接关闭了,线程正在处理的批次记录被丢弃。 以下是我的日志文件

  • 我有一个WebLogic10.3服务器和一个部署在上面的ear应用程序。 谢谢你,亚历克斯

  • 我对所有这些异步/多线程lib和本地clojure功能感到迷茫。 我有一个Web服务,它调用外部API,转换它响应,然后回馈给客户端。现在是用Python编写的。我想让每个客户端在单独的线程中执行其请求,这样它们就不会等待彼此完成,或者服务器是异步的。不涉及繁重的计算,只需等待IO。 我原以为使用clojure会很容易,但是我忽略了一些东西...Aleph是异步服务器吧?然而,当我在请求处理程序中

  • 我的程序使用Java脚本API,可以同时评估一些脚本。它们不使用共享脚本对象、绑定或上下文,但可以使用相同的和对象。我发现Java8中的OracleNashorn实现不是多线程的,返回,文档中说: 引擎实现不是线程安全的,不能用于在多个线程上并发执行脚本。 这是否意味着我应该为每个线程创建一个单独的实例?此外,文档中没有提到并发使用,而是: 每个已编译脚本都与一个脚本引擎相关联 可以假设线程安全依

  • 我想同时向一个webservice发送webservice调用。最多应有20个并行请求等待webservice响应。任何其他请求都应该等待它们完成。 如果一个用户向我发送一个请求,这通常会导致向目标服务器发送5个并行请求。因此,我一次最多可以服务20/5=4个用户。其他人将不得不等待,这很好。或者被高负荷拒绝。 问题:我应该使用哪个线程池,以及如何配置它? 我读了上面的内容如下:主池可以向网络服务

  • 问题内容: 我正在使用Square的Retrofit库进行短暂的网络调用。我在每个请求中都包含了一些数据作为参数。像这样: 必须定义并且对于中概述的每个单个端点都是很麻烦的。有没有一种方法可以设置每个请求应包含的基本参数集?类似于我们如何设置共同点? 问题答案: 您可以通过将一个自定义RequestInterceptor添加到RestAdapter来确保所有请求都具有这些查询参数。