#java #spring-boot #scheduled-tasks #javabeans #quartz-scheduler
#java #весенняя загрузка #запланированные задачи #javabeans #quartz-планировщик
Вопрос:
Я не могу понять, почему моя запланированная задача не будет выполняться. В большинстве справок, которые я там прочитал, говорится, что им не хватает @EnableScheduling для начального класса или им не хватает @Component для компонента, на котором включен планировщик. В моем коде присутствуют оба этих элемента, поэтому я не могу понять, чего мне здесь не хватает.
ОБНОВЛЕНИЕ: я вижу, что если я закомментирую компонент TaskExecutor, он начнет работать. Как я могу поддерживать свой исполнитель задач и использовать планировщик?
Главная
@SpringBootApplication
@EnableAutoConfiguration
@EnableAsync
@EnableScheduling
public class MonitoringApplication {
public static void main(String[] args) {
SpringApplication.run(MonitoringApplication.class, args);
}
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(1000);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("async-thread-");
executor.initialize();
return executor;
}
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedMethods("*");
}
}
}
@Component
public class HealthMonitor {
ArrayList<Application> apps = new ArrayList<>();
HashMap<String, String> groupQuery = new HashMap<>();
@Autowired
MyMonitoringAdapter monitoringAdapter;
@Autowired
ServiceNowAdapter snowAdapter;
@Autowired
SitePinger sitePinger;
@PostConstruct
public void getAllAppHealth() {
System.out.println("Monitor starting up...");
buildAllApplications();
populateProductLine();
populateAppMonitors();
getIncidents();
System.out.println("Monitor started! - async processes may still be running");
}
@Scheduled(fixedRate = 1000)
public void scheduledRefresh() {
System.out.println("Fixed rate task async - ");
refreshPing();
}
}
Комментарии:
1. В соответствии с вашим собственным редактированием удалите
TaskExecutor
и позвольте Spring Boot настроить это (вы можете настроить его вapplication.properties
). Также вы уверены, что хотите 100 потоков и это максимум (вероятно, где-то это станет узким местом).2. Было бы рекомендуемым решением просто позволить spring справиться с этим? Я читал руководство по настройке асинхронности в springboot, и у них была лучшая производительность с чем-то похожим
3. Я сделал то же самое, но у меня нет никаких проблем. Это явно работает для меня. Единственное изменение — у меня нет
WebConfiguration
и.@EnableAutoConfiguration
4. В версиях, предшествующих Spring Boot 2.1, не было предварительно настроенных
TaskExecutor
с момента Spring Boot 2.1, которые вы можете легко настроить с помощью свойств. Недостаток руководств, использующих более старые версии, поэтому вам не нужноTaskExecutor
. Также в планировании используется aTaskScheduler
, а не aTaskExecutor
.5. Спасибо за объяснение и помощь в понимании этого @M. Deinum . Как бы мне закрыть этот вопрос как решенный?