Как динамически обновлять Bean в @Configuration классе

87
02 июля 2021, 03:50
@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. Возможно ли это используя мой код? Если нет, то как выйти из данной ситуации и решить поставленную задачу?

Answer 1

Не получится лаконично описать динамичное расписание через аннотацию. Чтобы подобное реализовать, нужно самому описать запуск и остановку задач. Так же необходимо самому следить за изменениями в БД и переинициализировать задачу при изменении расписания. Например, как описано тут

READ ALSO
Почему getComputedStyle() отдает пустую строку во Vue?

Почему getComputedStyle() отдает пустую строку во Vue?

Для тренировки пишу простенький таймер на Vuejs Столкнулся с ошибкой при которой window

152
Не работает setState

Не работает setState

Изучаю Reactjs

340