Я полагаю, что в вашем коде есть пара не совсем правильных вещей.
- Ваш компонент реализует
AsyncConfigurer
- У вас нет
@EnableScheduling
Ваш CountyScraper
реализует интерфейс AsyncConfigurer
. Приводит к 2 возможным проблемам. Первый - это настройка асинхронной обработки со значениями по умолчанию и использованием прокси на основе интерфейса вместо прокси на основе класса. Отсюда устранение @Async
. Хотя последнее, кажется, не так, никто никогда не узнает.
На самом деле AsyncConfigurer
должен быть реализован вашим ExecutorConfig
.
@Configuration
@EnableAsync
@EnableScheduling
public class ExecutorConfig implements AsyncConfigurer {
public Executor getAsyncExecutor() {
return taskExecutor();
}
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new TaskExecutor();
taskExecutor.setCorePoolSize(10);
return taskExecutor;
}
}
Это настроит значение по умолчанию Executor
, используемое для асинхронной обработки. Вместо ConcurrentTaskExecutor
я использовал ThreadPoolTaskExecutor
. Последний позволяет немного больше конфигурации и будет хорошо очищать потоки, когда Spring Boot завершает работу.
СОВЕТ: Если вы используете Spring Boot 2.1, вы можете отказаться от конфигурации TaskExecutor
и заменить ее только на конфигурацию.
Теперь вы можете использовать простой @Async
вместо того, чтобы явно называть исполнителя (который теперь потерпит неудачу, потому что он назван по-другому).
spring.task.execution.pool.core-size=10 # Default is 8
Ваша конфигурация становится
@Configuration
@EnableAsync
@EnableScheduling
public class ExecutorConfig {}