Guide til ShedLock with Spring

1. Oversikt

Spring gir et enkelt å implementere API for planlegging av jobber. Det fungerer bra til vi distribuerer flere forekomster av applikasjonen vår. Våren kan som standard ikke håndtere planleggingssynkronisering over flere forekomster - den utfører jobbene samtidig på hver node i stedet.

I denne korte opplæringen ser vi på ShedLock - et Java-bibliotek som sørger for at våre planlagte oppgaver bare kjøres en gang samtidig og er et alternativ til kvarts.

2. Maven-avhengigheter

For å bruke ShedLock med Spring, må vi legge tilde skjul-våren avhengighet:

 net.javacrumbs.shedlock shedlock-spring 2.2.0 

3. Konfigurasjon

Merk at ShedLock bare fungerer i miljøer med en delt database ved å erklære en ordentlig LockProvider. Det oppretter en tabell eller et dokument i databasen der den lagrer informasjonen om gjeldende låser.

Foreløpig støtter ShedLock Mongo, Redis, Hazelcast, ZooKeeper og alt med en JDBC-driver.

For dette eksemplet, vi bruker en H2-database i minnet. For å få det til å fungere, må vi tilby H2-databasen og ShedLocks JDBC-avhengighet:

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

Deretter må vi lage en databasetabell for ShedLock for å beholde informasjon om planleggingslåser:

OPPRETT TABELL skjermlås (navn VARCHAR (64), lock_until TIMESTAMP (3) NULL, locked_at TIMESTAMP (3) NULL, locked_by VARCHAR (255), PRIMARY KEY (name))

Vi bør erklære datakilden i vår Spring Boot-applikasjons egenskaperfil slik at Datakilde bønne kan være Autotråd. I dette eksemplet bruker vi application.yml for å definere datakilden til H2-databasen:

vår: datakilde: driverClassName: org.h2.Driver url: jdbc: h2: mem: shedlock_DB; INIT = OPPRETT SCHEMA HVIS IKKE FINNER shedlock; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE brukernavn: et passord: 

La oss konfigurere LockProvider med datakildekonfigurasjonen ovenfor. Våren kan gjøre det ganske greit:

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

Et annet konfigurasjonskrav vi må tilby er @EnableScheduling og @EnableSchedulerLock kommentarer om vårkonfigurasjonsklassen vår:

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

De defaultLockAtMostFor parameter angir standard tid hvor låsen skal oppbevares i tilfelle den utførende noden dør. Den bruker ISO8601 varighetsformat.

I neste avsnitt ser vi hvordan du overstyrer denne standardverdien.

4. Opprette oppgaver

For å lage en planlagt oppgave håndtert av ShedLock, setter vi ganske enkelt @ Planlagt og @SchedulerLock merknader om en metode:

@Komponentklasse BaeldungTaskScheduler {@Scheduled (cron = "0 0/15 * * *?") @SchedulerLock (name = "TaskScheduler_scheduledTask", lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M") offentlig ugyldig // planlagt oppgave ...}}

La oss først se på @ Planlagt. Den støtter cron format, med dette uttrykket som betyr "hvert 15. minutt".

Neste, ta en titt på @SchedulerLock, de Navn parameteren må være unik, og ClassName_methodName er vanligvis nok til å oppnå det. Vi vil ikke at mer enn ett løp av denne metoden skal skje samtidig, og ShedLock bruker det unike navnet for å oppnå det.

Vi har også lagt til et par valgfrie parametere.

Først har vi lagt til lockAtLeastForString slik at vi kan legge litt avstand mellom metodeanropninger. Ved hjelp av “PT5M” betyr at denne metoden holder låsen i minst 5 minutter. Med andre ord, det betyr at denne metoden kan kjøres av ShedLock ikke oftere enn hvert femte minutt.

Deretter la vi til lockAtMostForString for å spesifisere hvor lenge låsen skal oppbevares i tilfelle den utførende noden dør. Ved hjelp av “PT14M” betyr at den blir låst i ikke lenger enn 14 minutter.

I normale situasjoner frigjør ShedLock låsen rett etter at oppgaven er ferdig. Nå trengte vi ikke gjøre det fordi det er standard angitt i @EnableSchedulerLock, men vi har valgt å overstyre det her.

5. Konklusjon

I denne artikkelen har vi lært hvordan du oppretter og synkroniserer planlagte oppgaver ved hjelp av ShedLock.

Som alltid er all kildekode tilgjengelig på GitHub.