Я определил пул потоков, подобный этому, в классе конфигурации
@Configuration
public class AsyncTaskExecutePool{
@Bean(name = "homepageThreadPoolExecutor")
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(80);
executor.setMaxPoolSize(200);
executor.setQueueCapacity(2000);
executor.setThreadNamePrefix("PE-");
executor.initialize();
return executor;
}
}
Он потребляется классом обслуживания, использующим этот
@Qualifier("homepageThreadPoolExecutor")
private Executor existingThreadPool;
Теперь метод, который его использует, и где используется пользовательский пул потоков.
public List<TestObject> getContent(List<TestObject> testList, HomepageRequest homePageRequest) {
try {
List<CompletableFuture<TestObject>> getProcessedList = testList.stream()
.map(n -> CompletableFuture.supplyAsync(
() -> processorFacade.getServiceType(n)
.process(homePageRequest, n), existingThreadPool))
.collect(Collectors.toList());
CompletableFuture<Void> allFutures = CompletableFuture
.allOf(getProcessedList.toArray(new CompletableFuture[getProcessedList.size()]));
CompletableFuture<List<TestObject>> allCompletableFuture =
allFutures.thenApply(future -> getProcessedList
.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList()));
return allCompletableFuture.get();
} catch (InterruptedException | ExecutionException e) {
logger.error("Error While Getting Content from getContent and Exception is {} ", e);
Thread.currentThread().interrupt();
return new ArrayList<>();
}
}
Теперь проблема: когда я запускаю интеграционный тест для получения содержимого, он застревает, и поток находится в состоянии ожидания. getProcessedList
не заполняется. Но в то же время, если я не передаю явный поток потоков в CompletableFuture
, он работает нормально. В чем может быть причина?