Sådan udløses og stoppes et planlagt springbatchjob

1. Oversigt

I denne vejledning undersøger vi og sammenligner forskellige måder med udløse og stoppe et planlagt Spring Batch-job for alle krævede forretningssager.

Hvis du har brug for introduktioner om Spring Batch og Scheduler, henvises der til artikler om Spring-Batch og Spring-Scheduler.

2. Udløs et planlagt springbatchjob

For det første har vi en klasse SpringBatchScheduler for at konfigurere planlægning og batchjob. En metode launchJob () vil blive registreret som en planlagt opgave.

Yderligere, for at udløse det planlagte Spring Batch-job på den mest intuitive måde, lad os tilføje et betinget flag for kun at fyre jobbet, når flaget er sat til sandt:

private AtomicBoolean aktiveret = ny AtomicBoolean (sand); privat AtomicInteger batchRunCounter = nyt AtomicInteger (0); @Scheduled (fixedRate = 2000) public void launchJob () kaster undtagelse {if (enabled.get ()) {Date date = new Date (); JobExecution jobExecution = jobLauncher () .run (job (), ny JobParametersBuilder () .addDate ("launchDate", dato) .toJobParameters ()); batchRunCounter.incrementAndGet (); }} // stop, startfunktioner (ændring af aktiveret flag)

Variablen batchRunCounter vil blive brugt i integrationstest for at kontrollere, om batchjobbet er stoppet.

3. Stop et planlagt springbatchjob

Med ovennævnte betingede flag er vi i stand til at udløse det planlagte Spring Batch-job med den planlagte opgave i live.

Hvis vi ikke har brug for at genoptage jobbet, kan vi faktisk stoppe den planlagte opgave for at spare ressourcer.

Lad os se på to muligheder i de næste to underafsnit.

3.1. Brug af Scheduler Post Processor

Da vi planlægger en metode ved hjælp af @ Planlagt annotation, en bønnepostprocessor ScheduledAnnotationBeanPostProcessor ville være blevet registreret først.

Vi kan eksplicit kalde postProcessBeforeDestruction () at ødelægge den givne planlagte bønne:

@Test offentlig ugyldig stopJobSchedulerWhenSchedulerDestroyed () kaster undtagelse {ScheduledAnnotationBeanPostProcessor bean = context .getBean (ScheduledAnnotationBeanPostProcessor.class); SpringBatchScheduler schedulerBean = kontekst .getBean (SpringBatchScheduler.class); afvente (). indtilAsserted (() -> Assert.assertEquals (2, schedulerBean.getBatchRunCounter (). get ())); bean.postProcessBeforeDestruction (schedulerBean, "SpringBatchScheduler"); afventer (). mindst (3, SEKONDER); Assert.assertEquals (2, schedulerBean.getBatchRunCounter (). Get ()); }

I betragtning af flere planlæggere er det bedre at holde en planlægger i sin egen klasse, så vi kan stoppe specifik planlægning efter behov.

3.2. Annullering af den planlagte Fremtid

En anden måde at stoppe planlæggeren på ville være manuelt at annullere dens Fremtid.

Her er en brugerdefineret opgaveplanlægning til optagelse Fremtid kort:

@Bean offentlig TaskScheduler poolScheduler () {returner ny CustomTaskScheduler (); } privat klasse CustomTaskScheduler udvider ThreadPoolTaskScheduler {// @Override public ScheduledFuture scheduleAtFixedRate (Runable task, long period) {ScheduledFuture future = super .scheduleAtFixedRate (task, period) ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) opgave; planningTasks.put (runnable.getTarget (), fremtid); vende tilbage fremtid }}

Så gentager vi Fremtid kort og annullere Fremtid til vores batchjobplanlægning:

offentlig ugyldig annullereFutureSchedulerTasks () {scheduletasker.forEach ((k, v) -> {hvis (k forekomst af SpringBatchScheduler) {v.cancel (false);}}); }

I tilfælde med flere planlægningsopgaver kan vi vedligeholde Fremtid kort inde i den tilpassede planlægningspulje, men annuller den tilsvarende planlagte Fremtid baseret på planlægningsklasse.

4. Konklusion

I denne hurtige artikel forsøgte vi tre forskellige måder at udløse eller stoppe et planlagt Spring Batch-job.

Når vi har brug for at genstarte batchjobbet, ville det være en fleksibel løsning at bruge et betinget flag til at styre jobkørsel. Ellers kan vi følge de to andre muligheder for at stoppe planlæggeren helt.

Som normalt er alle kodeeksempler, der bruges i artiklen, tilgængelige på GitHub.