Spring引导REST-对单个作业使用ThreadPoolTaskExecutor

Spring引导REST-对单个作业使用ThreadPoolTaskExecutor,spring,spring-boot,executorservice,spring-restcontroller,threadpoolexecutor,Spring,Spring Boot,Executorservice,Spring Restcontroller,Threadpoolexecutor,我加入了公司的一个新团队,我看到他们广泛使用“ThreadPoolTaskExecutor”。它基本上是一个前端的后端REST应用程序,它调用其他SOAP API并将结果返回给客户机—只是一个传递。99%的情况下,每个REST端点只调用一个SOAP API,并将json格式的响应返回给客户端。然而,尽管这只是一个SOAP调用,但它们使用“ThreadPoolTaskExecutor”并调用.get()阻塞方法 @Configuration类上的ThreadPoolTaskExecutor@Bea

我加入了公司的一个新团队,我看到他们广泛使用“ThreadPoolTaskExecutor”。它基本上是一个前端的后端REST应用程序,它调用其他SOAP API并将结果返回给客户机—只是一个传递。99%的情况下,每个REST端点只调用一个SOAP API,并将json格式的响应返回给客户端。然而,尽管这只是一个SOAP调用,但它们使用“ThreadPoolTaskExecutor”并调用.get()阻塞方法

@Configuration类上的ThreadPoolTaskExecutor@Bean

@Bean(name=“soapAsyncExecutor")
@Qualifier("soapAsyncExecutor")
   public ThreadPoolTaskExecutor getSoapAsyncExecutor() {
    final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    final ThreadFactory customThreadfactory = new ThreadFactoryBuilder()
        .setNameFormat(“SoapExecutor-%d")
        .setUncaughtExceptionHandler(uncaughtExceptionHandler())
        .setDaemon(true)
        .build();
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    executor.setCorePoolSize(80);
    executor.setMaxPoolSize(200);
    executor.setQueueCapacity(80);
    executor.setKeepAliveSeconds(60);
    executor.setAllowCoreThreadTimeOut(true);
    executor.setThreadFactory(customThreadfactory);
    executor.afterPropertiesSet();
    return executor;
   }
@服务上的代码

@Async("soapAsyncExecutor")
@Override
public Future<OrderInfo> getOrderInfoAsync(final String orderId) {
    return new AsyncResult<OrderInfo>(this.getOrderInfo(orderId);
}

private OrderInfo getOrderInfo(final String orderId) {
    // return result from SOAP call which typically take 1 second
}
据我所知,在Spring中对REST端点的每个请求都会产生一个新线程(因为我没有更好的词,所以我们称之为主线程)。在那里调用“.get()”方法会阻塞主线程。我的问题是,在这个封锁期

  • 主线程的官方状态是“阻塞”还是“等待”?如果被阻止,在单个作业中使用这样的“ThreadPoolTaskExecutor”是否有一点好处,因为它会导致主线程阻塞
  • 是否可以通过任何方式调整此代码以带来好处,或者在RestController端点内对这样的单个作业使用异步编程没有意义
  • 主线程的官方状态是“阻塞”还是“等待”

    封锁

    如果被阻止,在单个作业中使用这样的“ThreadPoolTaskExecutor”是否有一点好处,因为它会导致主线程阻塞

    没有。没有。事实上,我打赌将任务分派到线程池会带来额外的开销。不过,如果端点要等待多个任务完成,这是有意义的

    是否可以通过任何方式调整此代码以带来好处,或者在RestController端点内对这样的单个作业使用异步编程没有意义


    当然。给你。给你。基本上,在您的场景中,只需返回
    CompletableFuture
    即可,而不必调用
    .get()

    谢谢您的回答@crizziz。因此,当我们执行以下操作时,回调(随thenApply一起提供)将在主线程或池中执行?CompletableFuture.SupplySync(()->{//callback function来处理返回的数据},threadPool::execute);会把事情弄清楚一点
    @GetMapping(value = "/order/{orderId}")
    public OrderInfo getOrderInfo(@PathVariable("orderId") final String orderId) {
       OrderInfo orderInfo = orderService.getOrderInfoAsync(orderId).get();
       return orderInfo;
    }