Guide til ShedLock med forår

1. Oversigt

Spring giver en nem at implementere API til planlægning af job. Det fungerer godt, indtil vi implementerer flere forekomster af vores applikation. Forår kan som standard ikke håndtere planlægningssynkronisering over flere forekomster - det udfører jobene samtidigt på hver node i stedet.

I denne korte vejledning ser vi på ShedLock - et Java-bibliotek, der sikrer, at vores planlagte opgaver kun kører en gang på samme tid og er et alternativ til kvarts.

2. Maven-afhængigheder

For at bruge ShedLock med Spring skal vi tilføjedet skurlås-fjeder afhængighed:

 net.javacrumbs.shedlock shedlock-spring 2.2.0 

3. Konfiguration

Bemærk, at ShedLock kun fungerer i miljøer med en delt database ved at erklære en korrekt LockProvider. Det opretter en tabel eller et dokument i databasen, hvor det gemmer oplysningerne om de aktuelle låse.

I øjeblikket understøtter ShedLock Mongo, Redis, Hazelcast, ZooKeeper og alt andet med en JDBC-driver.

I dette eksempel vi bruger en H2-database i hukommelsen. For at få det til at fungere er vi nødt til at levere H2-databasen og ShedLocks JDBC-afhængighed:

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

Dernæst skal vi oprette en databasetabel til ShedLock for at opbevare oplysninger om planlægningslåse:

OPRET TABEL afskærmning (navn VARCHAR (64), lock_until TIMESTAMP (3) NULL, locked_at TIMESTAMP (3) NULL, locked_by VARCHAR (255), PRIMARY KEY (name))

Vi skal erklære datakilden i vores Spring Boot-applikations egenskabsfil, så Datakilde bønne kan være Autotråd. I dette eksempel bruger vi ansøgning.yml at definere datakilden til H2-databasen:

forår: datakilde: driverClassName: org.h2.Driver url: jdbc: h2: mem: shedlock_DB; INIT = OPRET SKEMA HVIS IKKE FINDES Shedlock; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE brugernavn: sa adgangskode: 

Lad os konfigurere LockProvider med datakildekonfigurationen ovenfor. Foråret kan gøre det ret ligetil:

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

Et andet konfigurationskrav, vi skal levere, er @EnableScheduling og @EnableSchedulerLock kommentarer til vores Spring-konfigurationsklasse:

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

Det defaultLockAtMostFor parameter angiver standardvarigheden af, at låsen skal opbevares, hvis den udførende node dør. Det bruger ISO8601 varighed format.

I det næste afsnit vil vi se, hvordan du tilsidesætter denne standard.

4. Oprettelse af opgaver

For at oprette en planlagt opgave, der håndteres af ShedLock, sætter vi simpelthen @ Planlagt og @SchedulerLock bemærkninger om en metode:

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

Lad os først se på @ Planlagt. Det understøtter cron format, hvor dette udtryk betyder "hvert 15. minut".

Dernæst kigger på @SchedulerLock, det navn parameter skal være unik, og ClassName_methodName er typisk nok til at opnå det. Vi ønsker ikke, at mere end en kørsel af denne metode skal ske på samme tid, og ShedLock bruger det unikke navn for at opnå det.

Vi har også tilføjet et par valgfri parametre.

Først har vi tilføjet lockAtLeastForString så vi kan lægge en vis afstand mellem metodeopkald. Ved brug af “PT5M” betyder, at denne metode holder låsen i mindst 5 minutter. Med andre ord, det betyder, at denne metode kan køres af ShedLock ikke oftere end hvert femte minut.

Dernæst tilføjede vi lockAtMostForString for at specificere, hvor længe låsen skal opbevares, hvis den udførende node dør. Ved brug af “PT14M” betyder, at den ikke bliver låst i mere end 14 minutter.

I normale situationer frigiver ShedLock låsen direkte, når opgaven er afsluttet. Nu behøvede vi ikke at gøre det fordi der er en standard i @EnableSchedulerLock, men vi har valgt at tilsidesætte det her.

5. Konklusion

I denne artikel har vi lært, hvordan man opretter og synkroniserer planlagte opgaver ved hjælp af ShedLock.

Som altid er al kildekode tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found