Az ütemezett tavaszi kötegelt feladat kiváltása és leállítása

1. Áttekintés

Ebben az oktatóanyagban megvizsgáljuk és összehasonlítjuk a különböző módszereket ütemezett tavaszi kötegelt feladat kiváltása és leállítása minden szükséges üzleti esetre.

Ha szüksége van a Spring Batch és a Scheduler bemutatkozására, olvassa el a Spring-Batch és Spring-Scheduler cikkeket.

2. Indítson be egy ütemezett tavaszi kötegelt feladatot

Először is van egy osztályunk SpringBatchScheduler az ütemezés és a kötegelt feladat konfigurálásához. Egy metódus launchJob () ütemezett feladatként lesz regisztrálva.

Ezenkívül az ütemezett tavaszi kötegelt feladat legegyszerűbb kiváltásához adjunk hozzá egy feltételes jelzőt, amely csak akkor indítja el a feladatot, ha a jel értéke igaz:

privát AtomicBoolean engedélyezve = új AtomicBoolean (true); privát AtomicInteger batchRunCounter = új AtomicInteger (0); @Scheduled (fixedRate = 2000) public void launchJob () dobja a Kivételt {if (enable.get ()) {Date date = new Date (); JobExecution jobExecution = jobLauncher () .run (job (), new JobParametersBuilder () .addDate ("launchDate", date) .toJobParameters ()); batchRunCounter.incrementAndGet (); }} // stop, start függvények (az engedélyezett jelzőjének megváltoztatása)

A változó batchRunCounter integrációs teszteken fogják használni annak ellenőrzésére, hogy a kötegelt feladat leállt-e.

3. Állítsa le az ütemezett tavaszi kötegelt munkát

A fenti feltételes jelöléssel kiválthatjuk az ütemezett Spring Batch feladatot az ütemezett feladattal.

Ha nem kell folytatnunk a munkát, akkor az erőforrások megtakarítása érdekében valóban leállíthatjuk az ütemezett feladatot.

Vessünk egy pillantást két lehetőségre a következő két alfejezetben.

3.1. A Scheduler Post Processor használata

Mivel a módszer használatát ütemezzük @Ütemezett annotáció, bab utáni feldolgozó ScheduledAnnotationBeanPostProcessor először regisztrálták volna.

Kifejezetten hívhatjuk a postProcessBeforeDestruction () hogy elpusztítsa az adott ütemezett babot:

@Test public void stopJobSchedulerWhenSchedulerDestroyed () dobja a Kivételt {ScheduledAnnotationBeanPostProcessor bean = context .getBean (ScheduledAnnotationBeanPostProcessor.class); SpringBatchScheduler schedulerBean = context .getBean (SpringBatchScheduler.class); várjon (). amígAsserted (() -> Assert.assertEquals (2, schedulerBean.getBatchRunCounter (). get ())); bean.postProcessBeforeDestruction (ütemezőBean, "SpringBatchScheduler"); várjon (). atLeast (3, SECONDS); Assert.assertEquals (2, schedulerBean.getBatchRunCounter (). Get ()); }

Több ütemezőt figyelembe véve jobb, ha egy ütemezőt a saját osztályában tartunk, így szükség szerint le tudjuk állítani az adott ütemezőt.

3.2. Az ütemezett törlése Jövő

Az ütemező leállításának másik módja a kézi törlés Jövő.

Itt van egy egyéni feladatütemező a rögzítéshez Jövő térkép:

@Bean public TaskScheduler poolScheduler () {return new CustomTaskScheduler (); } private class CustomTaskScheduler kiterjeszti a ThreadPoolTaskScheduler {// @Override public ScheduledFuture scheduleAtFixedRate (Futható feladat, hosszú időszak) {ScheduledFuture future = super .scheduleAtFixedRate (feladat, időszak); ScheduledMethodRunnable runnable = (ScheduledMethodRunnable) feladat; tervezettTasks.put (runnable.getTarget (), jövő); visszatérő jövő; }}

Aztán iteráljuk a Jövő térképet, és törölje a Jövő kötegelt munkaütemezőnk számára:

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

Több ütemező feladattal rendelkező esetekben fenntarthatjuk a Jövő térképet az egyéni ütemezőkészlet belsejében, de törölje a megfelelő ütemezést Jövő ütemező osztály alapján.

4. Következtetés

Ebben a rövid cikkben három különböző módszert próbáltunk ki az ütemezett Tavaszi kötegelt feladat elindítására vagy leállítására.

Amikor újra kell indítanunk a kötegelt feladatot, akkor a megoldás futtatásához egy feltételes jelző használata rugalmas megoldás lenne. Ellenkező esetben a másik két lehetőséget követhetjük az ütemező teljes leállításához.

Szokás szerint a cikkben használt összes kódminta elérhető a GitHubon.