Hoe u een geplande Spring Batch Job activeert en stopt

1. Overzicht

In deze tutorial onderzoeken en vergelijken we verschillende manieren om een geplande Spring Batch-taak activeren en stoppen voor alle vereiste businesscases.

Als u inleidingen over Spring Batch en Scheduler nodig heeft, raadpleeg dan de artikelen Spring-Batch en Spring-Scheduler.

2. Activeer een Geplande Spring Batch Job

Ten eerste hebben we een klas SpringBatchScheduler om planning en batchtaak te configureren. Een methode launchJob () wordt geregistreerd als een geplande taak.

Om de geplande Spring Batch-taak op de meest intuïtieve manier te activeren, kunnen we verder een voorwaardelijke vlag toevoegen om de taak alleen te activeren als de vlag is ingesteld op true:

private AtomicBoolean ingeschakeld = nieuwe AtomicBoolean (true); private AtomicInteger batchRunCounter = nieuwe AtomicInteger (0); @Scheduled (fixedRate = 2000) public void launchJob () gooit uitzondering {if (enabled.get ()) {Date date = new Date (); JobExecution jobExecution = jobLauncher () .run (job (), nieuwe JobParametersBuilder () .addDate ("launchDate", datum) .toJobParameters ()); batchRunCounter.incrementAndGet (); }} // stop, start functies (de vlag van ingeschakeld wijzigen)

De variabele batchRunCounter wordt gebruikt in integratietests om te controleren of de batchtaak is gestopt.

3. Stop een Geplande Spring Batch-taak

Met bovenstaande voorwaardelijke vlag kunnen we de geplande Spring Batch-taak activeren terwijl de geplande taak actief is.

Als we de taak niet hoeven te hervatten, kunnen we de geplande taak daadwerkelijk stoppen om middelen te besparen.

Laten we eens kijken naar twee opties in de volgende twee onderafdelingen.

3.1. Met behulp van Scheduler Post Processor

Omdat we een methode plannen met behulp van @Verwacht annotatie, een bean-postprocessor ScheduledAnnotationBeanPostProcessor zou eerst zijn geregistreerd.

We kunnen de postProcessBeforeDestruction () om de opgegeven geplande boon te vernietigen:

@Test openbare ongeldige stopJobSchedulerWhenSchedulerDestroyed () gooit uitzondering {ScheduledAnnotationBeanPostProcessor bean = context .getBean (ScheduledAnnotationBeanPostProcessor.class); SpringBatchScheduler schedulerBean = context .getBean (SpringBatchScheduler.class); wachten (). tillAsserted (() -> Assert.assertEquals (2, schedulerBean.getBatchRunCounter (). get ())); bean.postProcessBeforeDestruction (schedulerBean, "SpringBatchScheduler"); wachten (). ten minste (3, SECONDEN); Assert.assertEquals (2, schedulerBean.getBatchRunCounter (). Get ()); }

Gezien meerdere planners, is het beter om één planner in zijn eigen klasse te houden, zodat we de specifieke planner kunnen stoppen als dat nodig is.

3.2. Annuleren van het geplande Toekomst

Een andere manier om de planner te stoppen, is door het handmatig te annuleren Toekomst.

Hier is een aangepaste taakplanner voor het vastleggen Toekomst kaart:

@Bean openbare TaskScheduler poolScheduler () {retourneer nieuwe CustomTaskScheduler (); } privéklasse CustomTaskScheduler breidt ThreadPoolTaskScheduler uit {// @Override public ScheduledFuture scheduleAtFixedRate (Runnable-taak, lange periode) {ScheduledFuture future = super .scheduleAtFixedRate (taak, periode); ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) taak; geplandeTasks.put (runnable.getTarget (), toekomst); terugkeer toekomst; }}

Vervolgens herhalen we de Toekomst kaart en annuleer het Toekomst voor onze batch-taakplanner:

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

In de gevallen met meerdere planner-taken, kunnen we het Toekomst map in de aangepaste planningspool, maar annuleer de bijbehorende geplande Toekomst gebaseerd op planner klasse.

4. Conclusie

In dit korte artikel hebben we drie verschillende manieren geprobeerd om een ​​geplande Spring Batch-taak te activeren of te stoppen.

Wanneer we de batchtaak opnieuw moeten starten, zou het gebruik van een voorwaardelijke vlag om de uitvoering van de taak te beheren een flexibele oplossing zijn. Anders kunnen we de andere twee opties volgen om de planner volledig te stoppen.

Zoals gewoonlijk zijn alle codevoorbeelden die in het artikel worden gebruikt, beschikbaar op GitHub.


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