Spring boot runtime @Scheduled cron parameter refresh/reload/reinitializate

252
25 августа 2017, 23:17

Мое приложение выполняет задания в заданное время с помощью cron. Пользователь может изменять свойства файла, состоящие из конфигурации строк cron. Когда свойства файла изменяется, Spring должен обновить конфигурацию и все модули, зависящие от этой конфигурации во время выполнения.

Я пытался что-то сделать, но не работал для меня:

  1. @RefreshScope менял на CronTimerConfiguration класс.
  2. @RefreshScope менял на getTimer() @Bean не может создать саб класс final java.lang.String. Я попробывал поменять сигнатуру метода на public Object getTimer0(), это скомпилировалось, но не заработало.
  3. Event based property class. Это работало, но @Scheduled аннотация хочет постоянное значение поэтому я не могу юзать поля.
  4. Spring-boot-devtools авто рестарт. Добавляет проперти к application.properties: spring.devtools.restart.enabled=true и spring.devtools.restart.additional-paths=src/main/resources. Spring перезагружается когда файл изменяется, но foo() метод обрашяется к старому cron значению.
  5. Смена CronTimerConfiguration как здесь: @NotNull @Value(value = "${cron.timer0}") public String timer0;
  6. @PropertySource guide

У меня нету идей как заставить его работать? Возможно есть путь без аннотаций? Я видел классы что имитируют @Scheduled(fixedRate =""), но мне нужен класс что имитирует @Scheduled(cron ="").

PS Spring version 4.3.10.RELEASE

Configuration класс:

@Configuration
@ConfigurationProperties("cron")
public class CronTimerConfiguration {
    @NotNull
    private String timer0;
    public void setTimer0(String cronString) {
        this.timer0 = cronString;
    }
    @Bean
    public String getTimer0() {
        return timer0;
    }
}

application.properties йаил:

cron.timer0=0 0 */12 * * *

Контроллер:

@Controller
public class MainController {
    @Scheduled(cron = "${cron.timer0}")
    public void foo() {
        System.out.println("Time now is " + new SimpleDateFormat("HH:mm:ss").format(new Date()));
    }
}

SpringBootApplication:

@SpringBootApplication
@EnableScheduling
@ComponentScan(basePackages={"cron", "web"})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
Answer 1

Нашел решение через class implements SchedulingConfigurer и реализацию метода @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask(new Runnable() { @Override public void run() { paymentService.processPayment(); } }, new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { String cron = new SampleProperty().getStringProp1(); CronTrigger trigger = new CronTrigger(cron); return trigger.nextExecutionTime(triggerContext); } }); } с использованием event-based property class

READ ALSO
Динамичноее создание java SWT элементов

Динамичноее создание java SWT элементов

позволяет ли swt во время выполнения программы добавлять gui элементы? например нажал на кнопку и создался Label с каким-нибудь текстом upd: код...

188
Запросы к серверу, события

Запросы к серверу, события

Есть приложение, оно циклически отправляет запрос на сервер и если в ответ приходит новое сообщение то обновляет Лист вьюСкажите пожалуйста,...

194
Проблема с кодировкой при записи в файл Java

Проблема с кодировкой при записи в файл Java

Код для добавления написанной строки после определенной строкиРаньше проблема была и при чтении из файла, но поменяла в настройках кодировку...

317