Конфигурация Spring немного сбивает с толку в этом отношении, поскольку требует отдельной конфигурации для поддержки асинхронного MVC, то есть с использованием метода обработчика контроллера, который возвращает Callable
, и для любого метода bean-компонента Spring, аннотированного @Async
.Чтобы правильно настроить оба этих параметра, вы можете применить что-то вроде конфигурации ниже, имея в виду, что конфигурация AsyncTaskExecutor
может потребовать внесения изменений:
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Bean
protected WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
configurer.setTaskExecutor(getTaskExecutor());
}
};
}
@Bean
protected ConcurrentTaskExecutor getTaskExecutor() {
return new ConcurrentTaskExecutor(Executors.newFixedThreadPool(5));
}
}
В дополнение к этому, вы можете испытать искушение просто комментировать ваш контроллерметод обработчика с @Async
.Это будет иметь только желаемый эффект - освобождение потоков веб-сервера - при запуске и операциях забывания (это наблюдение основано на Spring Boot 2.1.2, возможно, они решат эту проблему в будущем).Если вы хотите использовать возможности Servlet 3.0 Asynchronous Processing , вам действительно нужно использовать Callables
и настроить их на WebMvcConfigurer
.