Come avviare e interrompere un lavoro batch di primavera programmato

1. Panoramica

In questo tutorial, esamineremo e confronteremo diversi modi per attivare e interrompere un processo Spring Batch pianificato per qualsiasi caso aziendale richiesto.

Se hai bisogno di presentazioni su Spring Batch e Scheduler, fai riferimento agli articoli Spring-Batch e Spring-Scheduler.

2. Avviare un lavoro batch di primavera pianificato

In primo luogo, abbiamo una classe SpringBatchScheduler per configurare la pianificazione e il lavoro batch. Un metodo launchJob () verrà registrato come attività pianificata.

Inoltre, per attivare il processo Spring Batch pianificato nel modo più intuitivo, aggiungiamo un flag condizionale per attivare il lavoro solo quando il flag è impostato su true:

private AtomicBoolean enabled = new AtomicBoolean(true); private AtomicInteger batchRunCounter = new AtomicInteger(0); @Scheduled(fixedRate = 2000) public void launchJob() throws Exception { if (enabled.get()) { Date date = new Date(); JobExecution jobExecution = jobLauncher() .run(job(), new JobParametersBuilder() .addDate("launchDate", date) .toJobParameters()); batchRunCounter.incrementAndGet(); } } // stop, start functions (changing the flag of enabled)

La variabile batchRunCounter verrà utilizzata nei test di integrazione per verificare se il lavoro batch è stato interrotto.

3. Interrompere un lavoro batch di primavera pianificato

Con il flag condizionale sopra, siamo in grado di attivare il processo Spring Batch pianificato con l'attività pianificata attiva.

Se non è necessario riprendere il lavoro, è possibile interrompere effettivamente l'attività pianificata per risparmiare risorse.

Diamo un'occhiata a due opzioni nelle prossime due sottosezioni.

3.1. Utilizzo del Post Processor dello Scheduler

Poiché stiamo pianificando un metodo utilizzando l' annotazione @Scheduled , un processore di post del bean ScheduledAnnotationBeanPostProcessor sarebbe stato registrato per primo.

Possiamo chiamare esplicitamente postProcessBeforeDestruction () per distruggere il bean programmato dato:

@Test public void stopJobSchedulerWhenSchedulerDestroyed() throws Exception { ScheduledAnnotationBeanPostProcessor bean = context .getBean(ScheduledAnnotationBeanPostProcessor.class); SpringBatchScheduler schedulerBean = context .getBean(SpringBatchScheduler.class); await().untilAsserted(() -> Assert.assertEquals( 2, schedulerBean.getBatchRunCounter().get())); bean.postProcessBeforeDestruction( schedulerBean, "SpringBatchScheduler"); await().atLeast(3, SECONDS); Assert.assertEquals( 2, schedulerBean.getBatchRunCounter().get()); }

Considerando più scheduler, è meglio mantenere uno scheduler nella propria classe, in modo da poter arrestare uno specifico scheduler secondo necessità.

3.2. Annullare il futuro programmato

Un altro modo per fermare lo scheduler sarebbe annullare manualmente il suo Future .

Ecco un pianificatore di attività personalizzato per l'acquisizione della mappa futura :

@Bean public TaskScheduler poolScheduler() { return new CustomTaskScheduler(); } private class CustomTaskScheduler extends ThreadPoolTaskScheduler { // @Override public ScheduledFuture scheduleAtFixedRate( Runnable task, long period) { ScheduledFuture future = super .scheduleAtFixedRate(task, period); ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) task; scheduledTasks.put(runnable.getTarget(), future); return future; } }

Quindi iteriamo la mappa del futuro e cancelliamo il futuro per il nostro pianificatore di lavori batch:

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

Nei casi con più attività dello scheduler, possiamo mantenere la mappa del futuro all'interno del pool dello scheduler personalizzato ma annullare il corrispondente Future pianificato in base alla classe dello scheduler.

4. Conclusione

In questo breve articolo, abbiamo provato tre diversi modi per attivare o interrompere un processo Spring Batch pianificato.

Quando è necessario riavviare il lavoro batch, l'utilizzo di un flag condizionale per gestire l'esecuzione del lavoro sarebbe una soluzione flessibile. Altrimenti, possiamo seguire le altre due opzioni per arrestare completamente lo scheduler.

Come al solito, tutti gli esempi di codice utilizzati nell'articolo sono disponibili su GitHub.