Весенняя загрузка: как параметризовать @Scheduled - PullRequest
3 голосов
/ 17 апреля 2019

Я новичок в Spring и только поцарапал поверхность того, что можно с этим сделать.

У меня есть ситуация, когда мне нужно настроить повторяющуюся задачу, используя аннотацию @Scheduled. Скорость указывается как поле члена в объекте, который передается в класс, инкапсулирующий метод, представляющий задачу.

Я использовал механизм, который позволяет получить доступ к конфигурации или среде, например, @Scheduled(fixedRateString = "${some.property:default}"); это прекрасно работает.

Что я не знаю, как это сделать, это вставить значение из объекта в @Scheduled.

Например:

class MyClass {
  private MyObject myObj;

  public MyClass(MyObject myObj) {
    this.myObj = myObj;
  }

  @Scheduled(fixedRateString = "${myObj.rate:5000}")
  private void someTask() {
    ...
  }
}

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

Любые предложения будут оценены.

Ответы [ 3 ]

2 голосов
/ 18 апреля 2019

К сожалению, процесс создания bean-компонента Spring не будет читать локальные переменные таким образом.

Вы можете использовать класс Spring TaskScheduler.

По сути, вам просто нужно определить пул потоков, который вы будете использовать для запуска запланированных задач (в виде компонента) и запустить taskScheduler.schedule (runnable, new CronTrigger ("* * * * *")).Вот подробный пример:

https://www.baeldung.com/spring-task-scheduler

1 голос
/ 18 апреля 2019

Да, вы можете использовать аннотацию @Scheduled, чтобы сделать это с выражением SpEL (доступно для аннотации @Scheduled начиная с Spring 4.3.x). Вот пример:

@Slf4j
@Configuration
@EnableScheduling
public class ExampleClass {

  static class ScheduleCalculator {
    public String calc() {
      return "5000";
    }
  }

  @Bean("scheduleCalculator")
  public ScheduleCalculator createScheduleCalculator() {
    return new ScheduleCalculator();
  }

  @Scheduled(fixedRateString = "#{scheduleCalculator.calc()}")
  public void someTask() {
    log.info("Hello world");
  }
}

Однако, только потому, что вы можете сделать это так, вовсе не обязательно.

Ваш код может быть проще для людей, которым необходимо его поддерживать в будущем, если вы используете планировщик задач spring , плюс вы получаете контроль над пулом потоков, используемым для планирования, вместо того, чтобы полагаться на общий исполнитель, что все @Scheduled задачи объединяются.

1 голос
/ 18 апреля 2019

Вы можете сделать следующее:

@Component
@ConfigurationProperties(prefix = "my.obj")
public class MyObject {

    private String cronExecExpr = "*/5 * * * * *";

    // getter and setter
}
class MyClass {
  private MyObject myObj;

  public MyClass(MyObject myObj) {
    this.myObj = myObj;
  }

  @Scheduled(cron = "${my.obj.cron-exec-expr:*/5 * * * * *}")
  private void someTask() {
    ...
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...