Запланированная задача весенней загрузки не выполняется

#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 . Также в планировании используется a TaskScheduler , а не a TaskExecutor .

5. Спасибо за объяснение и помощь в понимании этого @M. Deinum . Как бы мне закрыть этот вопрос как решенный?