@Configuration
public class TestScheduleConfig {
@Autowired
private TestScheduleRepo testScheduleRepo;
@RefreshScope
@Bean
public String getCronValue() throws Throwable {
Optional optional = testScheduleRepo.findById(1);
TestScheduleEntity entity = (TestScheduleEntity) optional.orElseThrow(() -> new EntityNotFoundException("Запись не найдена"));
String result = entity.getSecond() + " " +
entity.getMinute() + " " +
entity.getHour() + " " +
entity.getMonthDay() + " " +
entity.getMonth() + " " +
entity.getWeekDay()
;
return result;
}
}
@Service
public class TestScheduleMethod {
@Scheduled(cron="#{@getCronValue}")
public void printToConsole() {
System.out.println("SCHEDULE SUCCESS!!!");
}
}
Есть задача: Настроить расписание @Scheduled получая данные из БД.
У меня получилось настроить это как в коде выше (простой пример). Но если данные в БД изменятся, применить их можно только перезапустив приложение. Нашел предпологаемое решение: использовать аннотацию @RefreshScope, как в коде (@EnableConfigServer тоже стоит за кадром). Однако, на просторах интернета нашел, что эта аннотация не работает для @Configuration классов и методов, отмеченных аннотацией @Scheduled.
Это боль! Нужно сделать красиво и лаконично - безо всяких XML. Возможно ли это используя мой код? Если нет, то как выйти из данной ситуации и решить поставленную задачу?
Не получится лаконично описать динамичное расписание через аннотацию. Чтобы подобное реализовать, нужно самому описать запуск и остановку задач. Так же необходимо самому следить за изменениями в БД и переинициализировать задачу при изменении расписания. Например, как описано тут
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Для тренировки пишу простенький таймер на Vuejs Столкнулся с ошибкой при которой window
Итак, есть вот такой код: