Sprievodca po ShedLock s pružinou

1. Prehľad

Jar poskytuje ľahko implementovateľné API na plánovanie úloh. Funguje to skvele, kým nenasadíme viac inštancií našej aplikácie. Jar štandardne nedokáže zvládnuť synchronizáciu plánovača vo viacerých inštanciách - namiesto toho vykonáva úlohy súčasne na každom uzle.

V tomto krátkom tutoriáli sa pozrieme na ShedLock - knižnicu Java, ktorá zaisťuje, aby naše naplánované úlohy bežali iba raz v rovnakom čase a je alternatívou ku kremeňu.

2. Maven závislosti

Ak chcete použiť ShedLock s Spring, musíme pridaťthe shedlock-pružina závislosť:

 net.javacrumbs.shedlock shedlock-jar 2.2.0 

3. Konfigurácia

Upozorňujeme, že ShedLock funguje iba v prostrediach so zdieľanou databázou vyhlásením za správne LockProvider. Vytvorí tabuľku alebo dokument v databáze, kde uloží informácie o aktuálnych zámkoch.

V súčasnosti ShedLock podporuje ovládače JDBC pre Mongo, Redis, Hazelcast, ZooKeeper a čokoľvek.

Pre tento príklad použijeme databázu H2 v pamäti. Aby to fungovalo, musíme poskytnúť databázu H2 a závislosť JDBC od ShedLock:

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

Ďalej musíme vytvoriť databázovú tabuľku pre ShedLock, aby sme uchovali informácie o zámkoch plánovača:

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

Mali by sme deklarovať zdroj údajov v súbore vlastností našej aplikácie Spring Boot, aby Dátový zdroj fazuľa môže byť Autowired. V tomto príklade používame znak aplikácia.yml na definovanie zdroja údajov databázy H2:

pružina: zdroj údajov: driverClassName: org.h2. Adresa vodiča: jdbc: h2: mem: shedlock_DB; INIT = VYTVORIŤ SCHÉMU, AK NIE JE 

Poďme konfigurovať LockProvider s konfiguráciou zdroja údajov vyššie. Jar to môže pekne zjednodušiť:

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

Ďalšou požiadavkou na konfiguráciu, ktorú musíme poskytnúť, je @EnableScheduling a @EnableSchedulerLock anotácie k našej konfiguračnej triede Spring:

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

The defaultLockAtMostFor parameter určuje predvolené množstvo času, ktoré by sa zámok mal ponechať v prípade, že vykonávajúci uzol zomrie. Používa formát trvania ISO8601.

V ďalšej časti uvidíme, ako prepísať toto predvolené nastavenie.

4. Vytváranie úloh

Ak chcete vytvoriť naplánovanú úlohu, ktorú spracováva ShedLock, jednoducho vložte @Naplánovaný a @SchedulerLock anotácie k metóde:

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

Najprv sa pozrime na @Naplánovaný. Podporuje cron formáte, pričom tento výraz znamená „každých 15 minút“.

Ďalej sa pozrieme na @SchedulerLock, the názov parameter musí byť jedinečný a ClassName_methodName je zvyčajne dostatočné na dosiahnutie tohto cieľa. Nechceme, aby sa súčasne stalo viac ako jedno spustenie tejto metódy, a ShedLock na dosiahnutie tohto cieľa používa jedinečný názov.

Pridali sme tiež niekoľko voliteľných parametrov.

Najprv sme pridali lockAtLeastForString aby sme mohli dať určitý odstup medzi vyvolaním metódy. Použitím „PT5M“ znamená, že tento spôsob drží zámok minimálne 5 minút. Inými slovami, to znamená, že túto metódu nemôže ShedLock spustiť častejšie ako každých päť minút.

Ďalej sme pridali lockAtMostForString určiť, ako dlho sa má zámok ponechať v prípade, že vykonávajúci uzol zomrie. Použitím „PT14M“ znamená, že bude uzamknutý nie dlhšie ako 14 minút.

V normálnych situáciách ShedLock uvoľní zámok hneď po dokončení úlohy. Teraz sme to nemuseli robiť, pretože existuje predvolené nastavenie v @EnableSchedulerLock, ale rozhodli sme sa to tu prepísať.

5. Záver

V tomto článku sme sa naučili, ako vytvárať a synchronizovať naplánované úlohy pomocou ShedLock.

Ako vždy, všetok zdrojový kód je k dispozícii na GitHub.