Асинхронный API блокируется после обработки N запросов
Я разработал простой асинхронный API в Scala с использованием Spring MVC. В контроллере я использую DeferredResult<Map<String,Integer>> response = new DeferredResult<>(360000L,new String("PROCESSING_TIMEOUT"));
чтобы вернуть сообщение PROCESSING_TIMEOUT
в случае чрезмерно длительного времени обработки. Затем, чтобы протестировать этот API, я отправляю 100 одновременных запросов. Проблема заключается в том, что после успешной обработки около 50 первых запросов программа блокируется и ждет 360000 миллисекунд, а затем возвращает сообщение PROCESSING_TIMEOUT
и продолжает обработку остальных запросов. Затем он снова блокируется и разблокируется за 360000 миллисекунд. Я не понимаю такого поведения. Почему это происходит? И как это решить? Я пытался поиграть с параметрами размера основного пула и максимального размера пула, но это не решило проблему.
@Configuration
@SpringBootApplication
@EnableAsync
public class AppConfig implements AsyncConfigurer {
@Bean
public javax.validation.Validator localValidatorFactoryBean() {
return new LocalValidatorFactoryBean();
}
@Override
public Executor getAsyncExecutor() {
//return new SimpleAsyncTaskExecutor();
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(2);
executor.setQueueCapacity(1000);
executor.setThreadNamePrefix("MyExecutor-");
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new MyUncaughtExceptionHandler();
}
public static void main(String[] args) {
SpringApplication.run(AppConfig.class, args);
}
}