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.