Рубрики
Без рубрики

Условно включить запланированные рабочие места весной

Изучите различные варианты, чтобы условно включить весеннюю запланированную работу

Автор оригинала: Michael Pratt.

1. Введение

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

В этом учебнике мы будем смотреть на различные способы условно включить Весна запланированных рабочих мест.

2. Использование флага Булеан

Самый простой способ условно включить запланированное задание Spring – использовать булеан переменная что мы проверяем внутри запланированной работы. Переменная может быть аннотирована @Value чтобы сделать его настраиваемым с помощью обычных Механизмы весенней конфигурации :

@Configuration
@EnableScheduling
public class ScheduledJobs {
  @Value("${jobs.enabled:true}")
  private boolean isEnabled;

  @Scheduled(fixedDelay = 60000)
  public void cleanTempDirectory() {
    if(isEnabled) {
      // do work here
    }
  }
}

Недостатком является то, запланированное задание всегда будет выполнено к весеннему , которые не могут быть идеальными в некоторых случаях.

3. Использование @ConditionalOnProperty

Другой вариант заключается в использовании @ConditionalOnProperty аннотация. Он принимает название свойства Spring и работает только в том случае, если свойство оценивается истинный.

Во-первых, мы создаем новый класс, который инкапсулирует запланированный код задания, включая интервал расписания:

public class ScheduledJob {
    @Scheduled(fixedDelay = 60000)
    public void cleanTempDir() {
        // do work here
  }
}

Затем мы условно создаем фасоль такого типа:

@Configuration
@EnableScheduling
public class ScheduledJobs {
    @Bean
    @ConditionalOnProperty(value = "jobs.enabled", matchIfMissing = true, havingValue = "true")
    public ScheduledJob scheduledJob() {
        return new ScheduledJob();
    }
}

В этом случае задание будет работать, если jobs.enabled установлен на правда, или если его нет вообще. Недостатком является то, что эта аннотация доступны только в весенней загрузке.

4. Использование весенних профилей

Мы также можем условно включить запланированное задание Spring на основе профиля, с которого работает приложение. Например, такой подход полезен, когда задание должно быть запланировано только в рабочей среде.

Такой подход хорошо когда расписание одинаково во всех средах и его нужно только вы отключили или включили в определенных профилях .

Это работает аналогично использованию @ConditionalOnProperty , за исключением того, что мы используем @Profile аннотация о нашем методе фасоли:

@Profile("prod")
@Bean
public ScheduledJob scheduledJob() {
    return new ScheduledJob();
}

Это было бы создать задание только в том случае, если prod профиль активен . Кроме того, это дает нам полный набор вариантов, которые приходят с @Profile аннотация: сопоставление нескольких профилей, сложных весенних выражений и многое другое.

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

5. Значение Заполнитель в Крон Выражение

Используя держатели значений Spring, мы не только можем условно включить работу, но мы также можем изменить ее расписание:

@Scheduled(cron = "${jobs.cronSchedule:-}")
public void cleanTempDirectory() {
    // do work here
}

В этом примере задание отключено по умолчанию (с помощью специального выражения Spring cron).

Если мы хотим включить работу, все, что нам нужно сделать, это обеспечить действительное выражение cron для jobs.cronSchedule. Мы можем сделать это так же, как и любая другая конфигурация Spring: аргумент командной строки, переменная среды, файл свойств и так далее.

В отличие от выражений cron, нет никакого способа установить фиксированную задержку или значение с фиксированной ставкой, которое отключает работу. Поэтому этот подход работает только с cron запланированных рабочих мест .

6. Заключение

В этом учебнике мы видели несколько различных способов условно включить запланированную на весну работу. Некоторые подходы проще других, но могут иметь ограничения.

Полный исходный код для примеров доступен более на GitHub .