Anleitung zu ShedLock mit Feder

Anleitung zu ShedLock mit Feder

1. Überblick

Spring bietet eine einfach zu implementierende API zum Planen von Jobs. Es funktioniert einwandfrei, bis wir mehrere Instanzen unserer Anwendung bereitstellen. Standardmäßig kann Spring die Scheduler-Synchronisation nicht über mehrere Instanzen hinweg ausführen und führt die Jobs stattdessen gleichzeitig auf jedem Knoten aus.

In diesem kurzen Tutorial sehen wir uns ShedLock an - eine Java-Bibliothek, die sicherstellt, dass unsere geplanten Aufgaben nur einmal gleichzeitig ausgeführt werdenand is an alternative to Quartz.

2. Maven-Abhängigkeiten

Um ShedLock mit Spring zu verwenden, müssen wir the shedlock-spring dependency hinzufügen:


    net.javacrumbs.shedlock
    shedlock-spring
    2.2.0

3. Aufbau

Note that ShedLock works only in environments with a shared database. Erstellt eine Tabelle oder ein Dokument in der Datenbank, in der die Informationen zu den aktuellen Sperren gespeichert werden.

Gegenwärtig unterstützt ShedLock Mongo, Redis, Hazelcast, ZooKeeper und alles andere mit einem JDBC-Treiber.

In diesem Beispiel müssenwe’ll use a PostgreSQL database.ShedLock’s JDBC dependency angegeben werden, damit es funktioniert:


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

Als nächstes müssen wir eine Datenbanktabelle für ShedLock erstellen, um Informationen über 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)
)

Eine weitere Konfigurationsanforderung, die wir bereitstellen müssen, sind die Anmerkungen@EnableScheduling und@EnableSchedulerLock in unserer Spring-Konfigurationsklasse:

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

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

Der ParameterdefaultLockAtMostFor gibt an, wie lange die Sperre standardmäßig beibehalten werden soll, falls der ausführende Knoten stirbt. Es wird das FormatISO8601 Durationverwendet.

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 Anmerkungen@Scheduled und@SchedulerLock zu einer Methode hinzu:

@Component
class TaskScheduler {

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

Schauen wir uns zunächst@Scheduled an. Es unterstütztthe cron format, wobei dieser Ausdruck "alle 15 Minuten" bedeutet.

Wenn Sie sich@SchedulerLock, ansehen, muss der Parametername eindeutig sein, undClassName_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 wirlockAtLeastForString 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,that means that this method can be run by ShedLock no more often than every five minutes.

Als nächstes haben wirlockAtMostForString 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 Beendigung der Aufgabe frei. Eigentlich mussten wir das nicht tun, weilthere is a default provided in*@EnableSchedulerLock*,, aber wir haben uns entschieden, dies hier zu überschreiben.

5. Fazit

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

Wie immer ist der gesamte Quellcodeover on GitHub verfügbar.