#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, обычно это должно работать и для вас.