Vodič za ShedLock s proljećem

1. Pregled

Spring pruža jednostavan za implementaciju API za raspoređivanje poslova. Izvrsno funkcionira dok ne implementiramo više instanci naše aplikacije. Spring, prema zadanim postavkama, ne može obraditi sinkronizaciju planera na više instanci - umjesto toga izvršava poslove istovremeno na svakom čvoru.

U ovom ćemo kratkom vodiču pogledati ShedLock - Java knjižnicu koja osigurava da se naši planirani zadaci izvode samo jednom u isto vrijeme i alternativa je Kvarcu.

2. Ovisnosti Mavena

Da bismo koristili ShedLock s Springom, moramo dodatithe šupa-izvor ovisnost:

 net.javacrumbs.shedlock shedlock-spring 2.2.0 

3. Konfiguracija

Imajte na umu da ShedLock radi samo u okruženjima sa zajedničkom bazom podataka proglašavanjem ispravnim LockProvider. Stvara tablicu ili dokument u bazi podataka u kojoj pohranjuje informacije o trenutnim bravama.

Trenutno ShedLock podržava Mongo, Redis, Hazelcast, ZooKeeper i sve s JDBC upravljačkim programom.

Za ovaj primjer, koristit ćemo H2 bazu podataka u memoriji. Da bi to funkcioniralo, moramo pružiti H2 bazu podataka i ShedLockovu ovisnost o JDBC:

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

Dalje, moramo stvoriti tablicu baze podataka za ShedLock kako bismo zadržali informacije o zaključavanjima planera:

IZRADI shedlock TABLE (ime VARCHAR (64), lock_until TIMESTAMP (3) NULL, locked_at TIMESTAMP (3) NULL, locked_by VARCHAR (255), PRIMARNI KLJUČ (ime))

Izvor podataka trebali bismo proglasiti u datoteci svojstava naše aplikacije Spring Boot tako da Izvor podataka grah može biti Automatski ožičen. U ovom primjeru koristimo primjena.iml za definiranje izvora podataka baze podataka H2:

opruga: izvor podataka: driverClassName: org.h2.Driver url: jdbc: h2: mem: shedlock_DB; INIT = STVORI ŠEMU AKO NE POSTOJI shedlock; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE korisničko ime: sa lozinka: 

Konfigurirajmo LockProvider s gore navedenom konfiguracijom izvora podataka. Proljeće to može učiniti prilično jednostavnim:

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

Drugi konfiguracijski zahtjev koji moramo osigurati su @EnableScheduling i @EnableSchedulerLock napomene na našoj klasi konfiguracije Spring:

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

The defaultLockAtMostFor parametar određuje zadanu količinu vremena koje bi se brava trebala čuvati u slučaju da izvršni čvor umre. Koristi format trajanja ISO8601.

U sljedećem ćemo odjeljku vidjeti kako poništiti ovu zadanu postavku.

4. Izrada zadataka

Da bismo stvorili planirani zadatak kojim se bavi ShedLock, jednostavno stavimo @ Na rasporedu i @SchedulerLock napomene o metodi:

Klasa @Component BaeldungTaskScheduler {@ Zakazana (cron = "0 0/15 * * *?") @SchedulerLock (name = "TaskScheduler_scheduledTask", lockAtLeastForString = "PT5M", lockAtMostForString = "PT14MTk" public14 ") ...}}

Prvo, pogledajmo @ Na rasporedu. Podržava cron formatu, s ovim izrazom koji znači "svakih 15 minuta".

Dalje, bacite pogled na @SchedulerLock, the Ime parametar mora biti jedinstven, i Ime_klase_ime_ime je obično dovoljno da se to postigne. Ne želimo da se istovremeno odvija više pokretanja ove metode, a ShedLock koristi jedinstveni naziv da bi to postigao.

Dodali smo i nekoliko neobaveznih parametara.

Prvo, dodali smo lockAtLeastForString tako da možemo staviti određenu udaljenost između poziva metoda. Koristeći "PT5M" znači da će ova metoda zadržati bravu najmanje 5 minuta. Drugim riječima, to znači da ShedLock ovu metodu može izvoditi ne češće nego svakih pet minuta.

Dalje, dodali smo lockAtMostForString kako bi se naznačilo koliko dugo treba čuvati bravu u slučaju da izvršni čvor umre. Koristeći "PT14M" znači da će biti zaključana ne duže od 14 minuta.

U normalnim situacijama, ShedLock otpušta bravu izravno nakon završetka zadatka. Sad to nismo morali učiniti jer postoji zadana postavka u @EnableSchedulerLock, ali mi smo ovdje odlučili to nadvladati.

5. Zaključak

U ovom smo članku naučili kako stvoriti i sinkronizirati zakazane zadatke pomoću ShedLock-a.

Kao i uvijek, sav izvorni kod dostupan je na GitHub-u.