Hvordan utløse og stoppe en planlagt vårpartijobb

1. Oversikt

I denne opplæringen vil vi undersøke og sammenligne forskjellige måter å utløse og stoppe en planlagt Spring Batch-jobb for alle nødvendige forretningssaker.

Hvis du trenger introduksjoner om Spring Batch and Scheduler, kan du se artikler om Spring-Batch og Spring-Scheduler.

2. Utløs en planlagt vårpartijobb

For det første har vi en klasse SpringBatchScheduler for å konfigurere planlegging og batchjobb. En metode launchJob () vil bli registrert som en planlagt oppgave.

Videre, for å utløse den planlagte Spring Batch-jobben på den mest intuitive måten, la oss legge til et betinget flagg for å utløse jobben bare når flagget er satt til sant:

private AtomicBoolean aktivert = ny AtomicBoolean (true); private AtomicInteger batchRunCounter = nytt AtomicInteger (0); @Scheduled (fixedRate = 2000) public void launchJob () kaster unntak {if (enabled.get ()) {Date date = new Date (); JobExecution jobExecution = jobLauncher () .run (jobb (), ny JobParametersBuilder () .addDate ("launchDate", dato) .toJobParameters ()); batchRunCounter.incrementAndGet (); }} // stopp, start-funksjoner (endre flagget for aktivert)

Variabelen batchRunCounter vil bli brukt i integrasjonstester for å verifisere om batchjobben er stoppet.

3. Stopp en planlagt vårpartijobb

Med ovennevnte betingede flagg kan vi utløse den planlagte Spring Batch-jobben med den planlagte oppgaven i live.

Hvis vi ikke trenger å gjenoppta jobben, kan vi faktisk stoppe den planlagte oppgaven for å spare ressurser.

La oss se på to alternativer i de neste to underavsnittene.

3.1. Bruke Scheduler Post Processor

Siden vi planlegger en metode ved hjelp av @ Planlagt kommentar, en bønnepostbehandler ScheduledAnnotationBeanPostProcessor ville blitt registrert først.

Vi kan eksplisitt kalle postProcessBeforeDestruction () å ødelegge den gitte planlagte bønnen:

@Test offentlig ugyldig stoppJobSchedulerWhenSchedulerDestroyed () kaster unntak {ScheduledAnnotationBeanPostProcessor bean = context .getBean (ScheduledAnnotationBeanPostProcessor.class); SpringBatchScheduler schedulerBean = kontekst .getBean (SpringBatchScheduler.class); avvente (). til Asserted (() -> Assert.assertEquals (2, schedulerBean.getBatchRunCounter (). get ())); bean.postProcessBeforeDestruction (schedulerBean, "SpringBatchScheduler"); venter (). minst (3, SEKUNDER); Assert.assertEquals (2, schedulerBean.getBatchRunCounter (). Get ()); }

Tatt i betraktning flere planleggere, er det bedre å holde en planlegger i sin egen klasse, slik at vi kan stoppe spesifikk planlegger etter behov.

3.2. Avbryte det planlagte Framtid

En annen måte å stoppe planleggeren på ville være å kansellere den manuelt Framtid.

Her er en tilpasset oppgaveplanlegger for å fange Framtid kart:

@Bean offentlig TaskScheduler poolScheduler () {returner ny CustomTaskScheduler (); } privat klasse CustomTaskScheduler utvider ThreadPoolTaskScheduler {// @Override public ScheduledFuture scheduleAtFixedRate (Runnable task, long period) {ScheduledFuture future = super .scheduleAtFixedRate (oppgave, periode); ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) oppgave; planningTasks.put (runnable.getTarget (), fremtid); retur fremtid; }}

Så gjentar vi Framtid kart og avbryt Framtid for planleggeren av batchjobben vår:

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

I tilfeller med flere planleggeroppgaver, kan vi opprettholde Framtid kart inne i den tilpassede planleggingsgruppen, men avbryt den tilsvarende planlagte Framtid basert på planleggerklasse.

4. Konklusjon

I denne raske artikkelen prøvde vi tre forskjellige måter å utløse eller stoppe en planlagt Spring Batch-jobb.

Når vi trenger å starte batch-jobben på nytt, vil det være en fleksibel løsning å bruke et betinget flagg for å administrere jobbkjøring. Ellers kan vi følge de to andre alternativene for å stoppe planleggeren helt.

Som vanlig er alle kodeeksemplene som brukes i artikkelen tilgjengelig på GitHub.


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