Ako spustiť a zastaviť naplánovanú jarnú dávkovú prácu

1. Prehľad

V tomto tutoriáli preskúmame a porovnáme rôzne spôsoby spustiť a zastaviť naplánovanú úlohu Spring Batch pre všetky požadované obchodné prípady.

Ak potrebujete úvod o Spring Batch a Scheduler, prečítajte si články Spring-Batch a Spring Scheduler.

2. Spustite naplánovanú jarnú dávkovú prácu

Po prvé, máme triedu SpringBatchScheduler nakonfigurovať plánovanie a dávkovú úlohu. Metóda launchJob () bude zaregistrovaná ako naplánovaná úloha.

Ďalej, aby sme naplánovanú úlohu Spring Batch spustili najintuitívnejším spôsobom, pridajme podmienený príznak na spustenie úlohy iba v prípade, že je príznak nastavený na true:

private AtomicBoolean enabled = new AtomicBoolean (true); private AtomicInteger batchRunCounter = nový AtomicInteger (0); @Scheduled (fixedRate = 2000) public void launchJob () vyvolá výnimku {if (enabled.get ()) {Date date = new Date (); JobExecution jobExecution = jobLauncher () .run (job (), new JobParametersBuilder () .addDate ("launchDate", date) .toJobParameters ()); batchRunCounter.incrementAndGet (); }} // funkcie stop, start (zmena príznaku povolených)

Premenná batchRunCounter sa použije v integračných testoch na overenie, či bola dávková úloha zastavená.

3. Zastavte naplánovanú jarnú dávkovú prácu

S vyššie uvedeným príznakom môžeme spustiť naplánovanú úlohu Spring Batch s naplánovanou úlohou nažive.

Ak nepotrebujeme v úlohe pokračovať, môžeme naplánovanú úlohu skutočne zastaviť a ušetriť tak zdroje.

Pozrime sa na dve možnosti v nasledujúcich dvoch pododdieloch.

3.1. Používanie plánovača post procesora

Pretože plánujeme metódu pomocou @Naplánovaný anotácia, fazuľový post procesor ScheduledAnnotationBeanPostProcessor bol by zaregistrovaný ako prvý.

Môžeme výslovne nazvať postProcessBeforeDestruction () zničiť danú naplánovanú fazuľu:

@Test public void stopJobSchedulerWhenSchedulerDestroyed () vyvolá výnimku {ScheduledAnnotationBeanPostProcessor bean = kontext .getBean (ScheduledAnnotationBeanPostProcessor.class); SpringBatchScheduler schedulerBean = kontext .getBean (SpringBatchScheduler.class); await (). untilAsserted (() -> Assert.assertEquals (2, schedulerBean.getBatchRunCounter (). get ())); bean.postProcessBeforeDestruction (schedulerBean, "SpringBatchScheduler"); await (). aspon (3, SEKUNDY); Assert.assertEquals (2, schedulerBean.getBatchRunCounter (). Get ()); }

Ak vezmeme do úvahy viac plánovačov, je lepšie ponechať jeden plánovač vo svojej vlastnej triede, aby sme mohli podľa potreby zastaviť konkrétny plánovač.

3.2. Ruší sa plán Budúcnosť

Ďalším spôsobom, ako zastaviť plánovač, by bolo jeho manuálne zrušenie Budúcnosť.

Tu je vlastný plánovač úloh na zaznamenávanie Budúcnosť mapa:

@Bean public TaskScheduler poolScheduler () {return new CustomTaskScheduler (); } súkromná trieda CustomTaskScheduler rozširuje ThreadPoolTaskScheduler {// @Override public ScheduledFuture scheduleAtFixedRate (spustiteľná úloha, dlhé obdobie) {ScheduledFuture future = super .scheduleAtFixedRate (úloha, obdobie); ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) úloha; scheduledTasks.put (runnable.getTarget (), budúcnosť); návratová budúcnosť; }}

Potom iterujeme Budúcnosť zmapovať a zrušiť Budúcnosť pre nášho plánovača dávkových úloh:

public void cancelFutureSchedulerTasks () {scheduledTasks.forEach ((k, v) -> {if (k instanceof SpringBatchScheduler) {v.cancel (false);}}); }

V prípadoch s viacerými úlohami plánovača potom môžeme udržiavať Budúcnosť mapovať vo vnútri vlastnej oblasti plánovača, ale zrušiť zodpovedajúci naplánovaný Budúcnosť na základe triedy plánovača.

4. Záver

V tomto rýchlom článku sme vyskúšali tri rôzne spôsoby spustenia alebo zastavenia naplánovanej úlohy Spring Batch.

Ak potrebujeme reštartovať dávkovú úlohu, použitie podmieneného príznaku na správu chodu úlohy by bolo flexibilným riešením. V opačnom prípade môžeme postupovať podľa ďalších dvoch možností, aby sme plánovač úplne zastavili.

Ako obvykle sú všetky ukážky kódu použité v článku k dispozícii na GitHub.


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