Spring引导REST-对单个作业使用ThreadPoolTaskExecutor
我加入了公司的一个新团队,我看到他们广泛使用“ThreadPoolTaskExecutor”。它基本上是一个前端的后端REST应用程序,它调用其他SOAP API并将结果返回给客户机—只是一个传递。99%的情况下,每个REST端点只调用一个SOAP API,并将json格式的响应返回给客户端。然而,尽管这只是一个SOAP调用,但它们使用“ThreadPoolTaskExecutor”并调用.get()阻塞方法 @Configuration类上的ThreadPoolTaskExecutor@Bean: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
@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()”方法会阻塞主线程。我的问题是,在这个封锁期
当然。给你。给你。基本上,在您的场景中,只需返回
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;
}