Создание приложения планировщика, специфичного для конкретного, а не для конкретного сервера

#spring #quartz-scheduler

#spring #quartz-планировщик

Вопрос:

Мы должны привязать поток планировщика к контексту приложения.

Я пытался использовать @PostConstruct , но он запускает планировщик после запуска приложения, но он продолжает работать в фоновом режиме, даже если приложение не работает, а сервер включен.

Если приложение не работает, планировщик также должен остановиться.

Комментарии:

1. Почему у вас есть выделенный поток планировщика deamon? Spring будет / должен использовать a TaskScheduler , который заботится об очистке потоков при завершении работы,

2. Вы пробовали останавливать планировщик с помощью @PreDestroy? Конечно, это будет работать только в том случае, если приложение завершит работу корректно. Если вы хотите быть полностью уверены даже в случае сбоя приложения, вам следует выполнить проверку работоспособности вне вашего приложения.

Ответ №1:

Способ, которым я использовал Scheduler в Spring (т. Е. Spring Boot), заключается в наличии двух классов внутри моего проекта (и поэтому включен в my .jar после сборки).

1 — SchedulerConfig (необходимо для настройки)

 @Configuration
public class SchedulerConfig implements SchedulingConfigurer {

    private final int POOL_SIZE = 10;

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(POOL_SIZE);
        threadPoolTaskScheduler.setThreadNamePrefix("my-scheduled-task-pool-");
        threadPoolTaskScheduler.initialize();

        scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    }   
}
  

2 — ScheduledTasks (фактические запланированные задачи с частотой, определяемой выражением cron)

 @Component
public class ScheduledTasks {

    private static final Logger LOG = Logger.getLogger(ScheduledTasks.class);

    @Scheduled(cron = "0 0 * ? * *")
    public void doSomething() { 
        // Do something
    }
}
  

Поэтому, поскольку все включено в running .jar, когда приложение больше не развернуто, запланированные задачи также не будут выполняться.

Смотрите также https://www.baeldung.com/spring-scheduled-tasks

Комментарии:

1. Я использую Spring MVC с Java версии 7. Итак, каковы возможные способы планирования задания в этом случае с использованием Spring Scheduler, чтобы задание запускалось после запуска приложения и останавливалось, если приложение не работает. В основном планировщик должен выполняться в контексте приложения, а не в контексте сервера.

2. Я понимаю вашу точку зрения, однако я не работал с планировщиком вне Spring Boot. Мне нужно поискать об этом и сообщить вам. 🙂

3. @SouravMehra Решение, которое я опубликовал, выполняется в контексте приложения, а не сервера. Вы пробовали это ..? Неважно, что я использую Spring Boot, обычно это должно работать и для вас.