Kako pokrenuti i zaustaviti planirani proljetni paketni posao

1. Pregled

U ovom uputstvu istražit ćemo i usporediti različite načine okidač i zaustavljanje zakazanog proljetnog paketnog posla za sve potrebne poslovne slučajeve.

Ako trebate uvod o Spring Batchu i Scheduleru, pogledajte članke Spring-Batch i Spring-Scheduler.

2. Pokrenite planirani proljetni paketni posao

Prvo, imamo nastavu SpringBatchScheduler za konfiguriranje raspoređivanja i batch posla. Metoda launchJob () bit će registriran kao planirani zadatak.

Nadalje, da bismo na najintuitivniji način pokrenuli planirani proljetni batch posao, dodajmo uvjetnu zastavicu za pokretanje posla samo kada je zastavica postavljena na true:

private AtomicBoolean enabled = new AtomicBoolean (true); private AtomicInteger batchRunCounter = novi AtomicInteger (0); @Scheduled (fixedRate = 2000) public void launchJob () baca iznimku {if (enabled.get ()) {Date date = novi datum (); JobExecution jobExecution = jobLauncher () .run (job (), novi JobParametersBuilder () .addDate ("datum pokretanja", datum) .toJobParameters ()); batchRunCounter.incrementAndGet (); }} // zaustavljanje, pokretanje funkcija (promjena oznake omogućeno)

Varijabla batchRunCounter koristit će se u integracijskim testovima kako bi se provjerilo je li skupni posao zaustavljen.

3. Zaustavite planirani proljetni paketni posao

S gornjom uvjetnom zastavicom, možemo pokrenuti planirani proljetni paketni posao s planiranim zadatkom uživo.

Ako ne moramo nastaviti posao, tada stvarno možemo zaustaviti planirani zadatak radi uštede resursa.

Pogledajmo dvije mogućnosti u sljedeća dva pododjeljka.

3.1. Korištenje procesora za obradu rasporeda

Budući da metodu zakazujemo pomoću @ Na rasporedu napomena, post procesor graha ScheduledAnnotationBeanPostProcessor bi prvo bio registriran.

Možemo izričito nazvati postProcessBeforeDestruction () da biste uništili zadani grah:

@Test public void stopJobSchedulerWhenSchedulerDestroyed () baca iznimku {ScheduledAnnotationBeanPostProcessor bean = context .getBean (ScheduledAnnotationBeanPostProcessor.class); SpringBatchScheduler schedulerBean = context .getBean (SpringBatchScheduler.class); await (). dokAsserted (() -> Assert.assertEquals (2, schedulerBean.getBatchRunCounter (). get ())); bean.postProcessBeforeDestruction (planerBean, "SpringBatchScheduler"); await (). atLeast (3, SEKUNDE); Assert.assertEquals (2, schedulerBean.getBatchRunCounter (). Get ()); }

Uzimajući u obzir više planera, bolje je zadržati jednog planera u svojoj klasi, tako da možemo zaustaviti određeni planer po potrebi.

3.2. Otkazivanje zakazanog Budućnost

Drugi način zaustavljanja planera bio bi ručno otkazivanje Budućnost.

Evo prilagođenog planera zadataka za snimanje Budućnost karta:

@Bean public TaskScheduler poolScheduler () {return new CustomTaskScheduler (); } privatna klasa CustomTaskScheduler proširuje ThreadPoolTaskScheduler {// @Override public ScheduledFuture scheduleAtFixedRate (izvršivi zadatak, dugo razdoblje) {ScheduledFuture future = super .scheduleAtFixedRate (zadatak, period); ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) zadatak; rasporedTasks.put (runnable.getTarget (), budućnost); povratak budućnost; }}

Zatim ponovimo Budućnost mapirati i otkazati Budućnost za naš batch planer poslova:

javna void cancelFutureSchedulerTasks () {rasporedTasks.forEach ((k, v) -> {if (k instanca SpringBatchScheduler) {v.cancel (false);}}); }

U slučajevima s više zadataka planera, tada možemo održavati Budućnost mapa unutar spremišta prilagođenog planera, ali otkažite odgovarajuće zakazano Budućnost na temelju klase planera.

4. Zaključak

U ovom smo kratkom članku isprobali tri različita načina za pokretanje ili zaustavljanje zakazanog proljetnog skupnog posla.

Kada trebamo ponovno pokrenuti batch posao, upotreba uvjetne zastavice za upravljanje izvršavanjem posla bilo bi fleksibilno rješenje. U suprotnom, možemo slijediti druge dvije mogućnosti da u potpunosti zaustavimo rokovnik.

Kao i obično, svi uzorci koda korišteni u članku dostupni su na GitHubu.