Guide to ShedLock with Spring

Путеводитель по ShedLock с весны

1. обзор

Spring предоставляет простой в реализации API для планирования заданий. Он прекрасно работает, пока мы не развернем несколько экземпляров нашего приложения. Spring по умолчанию не может обрабатывать синхронизацию планировщика для нескольких экземпляров и выполняет задания одновременно на каждом узле.

В этом коротком руководстве мы рассмотрим ShedLock - библиотеку Java, которая гарантирует, что наши запланированные задачи выполняются только один раз в одно и то же времяand is an alternative to Quartz.

2. Maven Зависимости

Чтобы использовать ShedLock с Spring, нам нужно добавить the shedlock-spring dependency:


    net.javacrumbs.shedlock
    shedlock-spring
    2.2.0

3. конфигурация

Note that ShedLock works only in environments with a shared database. Создает таблицу или документ в базе данных, где хранит информацию о текущих блокировках.

В настоящее время ShedLock поддерживает Mongo, Redis, Hazelcast, ZooKeeper и все что угодно с драйвером JDBC.

В этом примереwe’ll use a PostgreSQL database. Чтобы он работал, нам нужно предоставитьShedLock’s JDBC dependency:


    net.javacrumbs.shedlock
    shedlock-provider-jdbc-template
    2.1.0

Далее нам нужно создать таблицу базы данных для ShedLock, чтобы хранить информацию о блокировках планировщика:

CREATE TABLE shedlock(
  name VARCHAR(64),
  lock_until TIMESTAMP(3) NULL,
  locked_at TIMESTAMP(3) NULL,
  locked_by  VARCHAR(255),
  PRIMARY KEY (name)
)

Еще одно требование к конфигурации, которое мы должны предоставить, - это аннотации@EnableScheduling и@EnableSchedulerLock в нашем классе конфигурации Spring:

@SpringBootApplication
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class SpringApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringApplication.class, args);
    }
}

ПараметрdefaultLockAtMostFor указывает время по умолчанию, в течение которого блокировка должна храниться в случае, если исполняющий узел умирает. Он использует форматISO8601 Duration.

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

4. Создание задач

Чтобы создать запланированную задачу, обрабатываемую ShedLock, мы просто помещаем аннотации@Scheduled и@SchedulerLock в метод:

@Component
class TaskScheduler {

    @Scheduled(cron = "*/15 * * * *")
    @SchedulerLock(name = "TaskScheduler_scheduledTask",
      lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M")
    public void scheduledTask() {
        // ...
    }
}

Во-первых, давайте посмотрим на@Scheduled. Он поддерживаетthe cron format, что означает «каждые 15 минут».

Затем, взглянув на@SchedulerLock,, параметрname должен быть уникальным, и для этого обычно достаточноClassName_methodName. Мы не хотим, чтобы выполнялось более одного запуска этого метода одновременно, и ShedLock использует для этого уникальное имя.

Мы также добавили несколько необязательных параметров.

Во-первых, мы добавилиlockAtLeastForString, чтобы можно было увеличить расстояние между вызовами методов. Использование“PT5M” означает, что этот метод будет удерживать блокировку не менее 5 минут. Другими словами,that means that this method can be run by ShedLock no more often than every five minutes.

Затем мы добавилиlockAtMostForString, чтобы указать, как долго должна храниться блокировка в случае, если исполняющий узел умирает. Использование“PT14M” означает, что он будет заблокирован не дольше 14 минут.

В обычных ситуациях ShedLock снимает блокировку сразу после завершения задачи. На самом деле, нам не нужно было этого делать, потому чтоthere is a default provided in*@EnableSchedulerLock*,, но мы решили переопределить это здесь.

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

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

Как всегда доступен весь исходный кодover on GitHub.