Anleitung zu ShedLock mit Feder

1. Übersicht

Spring bietet eine einfach zu implementierende API zum Planen von Jobs. Es funktioniert hervorragend, bis wir mehrere Instanzen unserer Anwendung bereitstellen. Spring kann die Scheduler-Synchronisierung standardmäßig nicht über mehrere Instanzen hinweg ausführen. Stattdessen werden die Jobs gleichzeitig auf jedem Knoten ausgeführt.

In diesem kurzen Tutorial sehen wir uns ShedLock an - eine Java-Bibliothek, die sicherstellt, dass unsere geplanten Aufgaben nur einmal gleichzeitig ausgeführt werden und eine Alternative zu Quartz darstellt.

2. Maven-Abhängigkeiten

Um ShedLock mit Spring zu verwenden, müssen wir hinzufügendie Shedlock-Spring- Abhängigkeit:

 net.javacrumbs.shedlock shedlock-spring 2.2.0 

3. Konfiguration

Beachten Sie, dass ShedLock nur in Umgebungen mit einer gemeinsam genutzten Datenbank funktioniert, indem ein geeigneter LockProvider deklariert wird . Es erstellt eine Tabelle oder ein Dokument in der Datenbank, in der die Informationen zu den aktuellen Sperren gespeichert werden.

Derzeit unterstützt ShedLock Mongo, Redis, Hazelcast, ZooKeeper und alles mit einem JDBC-Treiber.

In diesem Beispiel verwenden wir eine speicherinterne H2-Datenbank. Damit es funktioniert, müssen wir die H2-Datenbank und die JDBC-Abhängigkeit von ShedLock bereitstellen:

 net.javacrumbs.shedlock shedlock-provider-jdbc-template 2.1.0   com.h2database h2 1.4.200 

Als Nächstes müssen wir eine Datenbanktabelle für ShedLock erstellen, um Informationen zu Scheduler-Sperren zu erhalten:

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

Wir sollten die Datenquelle in der Eigenschaftendatei unserer Spring Boot-Anwendung deklarieren, damit die DataSource- Bean automatisch verdrahtet werden kann . In diesem Beispiel verwenden wir die Datei application.yml , um die Datenquelle der H2-Datenbank zu definieren:

spring: datasource: driverClassName: org.h2.Driver url: jdbc:h2:mem:shedlock_DB;INIT=CREATE SCHEMA IF NOT EXISTS shedlock;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE username: sa password: 

Lassen Sie uns den LockProvider mit der obigen Datenquellenkonfiguration konfigurieren. Der Frühling kann es ziemlich einfach machen:

@Configuration public class SchedulerConfiguration { @Bean public LockProvider lockProvider(DataSource dataSource) { return new JdbcTemplateLockProvider(dataSource); } }

Eine weitere Konfigurationsanforderung, die wir bereitstellen müssen, sind die Annotationen @EnableScheduling und @EnableSchedulerLock für unsere Spring-Konfigurationsklasse:

@SpringBootApplication @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") public class Application { public static void main(String[] args) { SpringApplication.run(SpringApplication.class, args); } }

Der Parameter defaultLockAtMostFor gibt an, wie lange die Sperre standardmäßig beibehalten werden soll, falls der ausführende Knoten stirbt. Es wird das ISO8601 Duration-Format verwendet.

Im nächsten Abschnitt erfahren Sie, wie Sie diese Standardeinstellung überschreiben.

4. Aufgaben erstellen

Um eine geplante Aufgabe zu erstellen, die von ShedLock verarbeitet wird, fügen wir einfach die Annotationen @Scheduled und @SchedulerLock einer Methode hinzu:

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

Schauen wir uns zunächst @Scheduled an . Es unterstützt das Cron- Format, wobei dieser Ausdruck "alle 15 Minuten" bedeutet.

Wenn Sie sich @SchedulerLock ansehen, muss der Parameter name eindeutig sein, und ClassName_methodName reicht normalerweise aus, um dies zu erreichen. Wir möchten nicht, dass mehr als ein Durchlauf dieser Methode gleichzeitig ausgeführt wird, und ShedLock verwendet den eindeutigen Namen, um dies zu erreichen.

Wir haben auch einige optionale Parameter hinzugefügt.

Zuerst haben wir lockAtLeastForString hinzugefügt, damit wir einen gewissen Abstand zwischen Methodenaufrufen setzen können. Die Verwendung von „PT5M“ bedeutet, dass diese Methode die Sperre mindestens 5 Minuten lang hält. Mit anderen Worten bedeutet dies, dass diese Methode von ShedLock nicht öfter als alle fünf Minuten ausgeführt werden kann.

Als Nächstes haben wir lockAtMostForString hinzugefügt, um anzugeben, wie lange die Sperre beibehalten werden soll, falls der ausführende Knoten stirbt. Die Verwendung von „PT14M“ bedeutet, dass es nicht länger als 14 Minuten gesperrt ist.

In normalen Situationen gibt ShedLock die Sperre direkt nach Abschluss der Aufgabe auf. Jetzt mussten wir das nicht tun, da in @EnableSchedulerLock eine Standardeinstellung bereitgestellt wird , aber wir haben uns entschieden, diese hier zu überschreiben.

5. Schlussfolgerung

In diesem Artikel haben wir gelernt, wie Sie geplante Aufgaben mit ShedLock erstellen und synchronisieren.

Wie immer ist der gesamte Quellcode über GitHub verfügbar.