Путеводитель по 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.