Gids voor ShedLock met Spring

1. Overzicht

Spring biedt een eenvoudig te implementeren API voor het plannen van taken. Het werkt geweldig totdat we meerdere exemplaren van onze applicatie hebben geïmplementeerd. Spring kan standaard geen schedulersynchronisatie over meerdere instanties aan - het voert de taken tegelijkertijd uit op elk knooppunt.

In deze korte tutorial kijken we naar ShedLock - een Java-bibliotheek die ervoor zorgt dat onze geplande taken slechts één keer tegelijk worden uitgevoerd en is een alternatief voor Quartz.

2. Maven afhankelijkheden

Om ShedLock met Spring te gebruiken, moeten we toevoegende shedlock-spring afhankelijkheid:

 net.javacrumbs.shedlock shedlock-spring 2.2.0 

3. Configuratie

Merk op dat ShedLock alleen werkt in omgevingen met een gedeelde database door een proper LockProvider. Het maakt een tabel of document in de database waarin het de informatie over de huidige vergrendelingen opslaat.

Momenteel ondersteunt ShedLock Mongo, Redis, Hazelcast, ZooKeeper en alles met een JDBC-stuurprogramma.

Voor dit voorbeeld we gebruiken een H2-database in het geheugen. Om het te laten werken, hebben we de H2-database en de JDBC-afhankelijkheid van ShedLock nodig:

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

Vervolgens moeten we een databasetabel maken voor ShedLock om informatie over plannervergrendelingen te bewaren:

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

We moeten de gegevensbron declareren in het eigenschappenbestand van onze Spring Boot-applicatie, zodat het Databron boon kan zijn Met automatische bedrading. In dit voorbeeld gebruiken we de application.yml om de gegevensbron van de H2-database te definiëren:

spring: datasource: driverClassName: org.h2.Driver url: jdbc: h2: mem: shedlock_DB; INIT = SCHEMA MAKEN INDIEN NIET BESTAAT shedlock; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE gebruikersnaam: sa wachtwoord: 

Laten we het LockProvider met de bovenstaande gegevensbronconfiguratie. De lente kan het vrij eenvoudig maken:

@Configuration openbare klasse SchedulerConfiguration {@Bean openbare LockProvider lockProvider (DataSource dataSource) {retourneer nieuwe JdbcTemplateLockProvider (dataSource); }}

Een andere configuratievereiste die we moeten bieden, zijn de @EnableScheduling en @BuienRadarNL annotaties op onze Spring-configuratieklasse:

@SpringBootApplication @EnableScheduling @EnableSchedulerLock (defaultLockAtMostFor = "PT30S") openbare klasse Toepassing {openbare statische leegte hoofd (String [] args) {SpringApplication.run (SpringApplication.class, args); }}

De defaultLockAtMostFor parameter specificeert de standaard hoeveelheid tijd dat het slot bewaard moet blijven voor het geval het uitvoerende knooppunt sterft. Het gebruikt het ISO8601 Duration-formaat.

In de volgende sectie zullen we zien hoe u deze standaard kunt overschrijven.

4. Taken aanmaken

Om een ​​geplande taak te maken die door ShedLock wordt afgehandeld, plaatsen we eenvoudig de @Verwacht en @BuienRadarNL annotaties op een methode:

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

Laten we eerst eens kijken @Verwacht. Het ondersteunt het cron formaat, waarbij deze uitdrukking "elke 15 minuten" betekent.

Vervolgens een kijkje nemen @SchemaLock, de naam parameter moet uniek zijn, en ClassName_methodName is doorgaans voldoende om dat te bereiken. We willen niet dat deze methode meer dan één keer tegelijkertijd wordt uitgevoerd, en ShedLock gebruikt de unieke naam om dat te bereiken.

We hebben ook een aantal optionele parameters toegevoegd.

Ten eerste hebben we toegevoegd lockAtLeastForString zodat we wat afstand kunnen plaatsen tussen methode-aanroepen. Gebruik makend van "PT5M" betekent dat deze methode het slot minimaal 5 minuten vasthoudt. Met andere woorden, dat betekent dat deze methode niet vaker dan om de vijf minuten door ShedLock kan worden uitgevoerd.

Vervolgens hebben we toegevoegd lockAtMostForString om aan te geven hoe lang het slot moet worden bewaard voor het geval het uitvoerende knooppunt sterft. Gebruik makend van "PT14M" betekent dat het niet langer dan 14 minuten vergrendeld is.

In normale situaties geeft ShedLock de vergrendeling onmiddellijk vrij nadat de taak is voltooid. Nu hoefden we dat niet te doen omdat er is een standaard voorzien in @EnableSchedulerLock, maar we hebben ervoor gekozen om dat hier te negeren.

5. Conclusie

In dit artikel hebben we geleerd hoe u geplande taken kunt maken en synchroniseren met ShedLock.

Zoals altijd is alle broncode beschikbaar op GitHub.