Cara Memicu dan Menghentikan Pekerjaan Kelompok Musim Semi Terjadwal

1. Ikhtisar

Dalam tutorial ini, kami akan menyelidiki dan membandingkan berbagai cara untuk memicu dan menghentikan pekerjaan Spring Batch terjadwal untuk setiap kasus bisnis yang diperlukan.

Jika Anda membutuhkan perkenalan tentang Spring Batch dan Scheduler, lihat artikel Spring-Batch dan Spring-Scheduler.

2. Memicu Pekerjaan Kelompok Musim Semi Terjadwal

Pertama, kami memiliki kelas SpringBatchScheduler untuk mengonfigurasi penjadwalan dan pekerjaan batch. Metode launchJob () akan didaftarkan sebagai tugas terjadwal.

Selanjutnya, untuk memicu tugas Batch Musim Semi terjadwal dengan cara yang paling intuitif, mari tambahkan tanda bersyarat untuk mengaktifkan pekerjaan hanya jika bendera disetel ke 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)

Variabel batchRunCounter akan digunakan dalam pengujian integrasi untuk memverifikasi jika pekerjaan batch telah dihentikan.

3. Hentikan Pekerjaan Kelompok Musim Semi Terjadwal

Dengan bendera bersyarat di atas, kami dapat memicu tugas Batch Musim Semi terjadwal dengan tugas terjadwal aktif.

Jika kita tidak perlu melanjutkan pekerjaan, maka kita sebenarnya dapat menghentikan tugas terjadwal untuk menghemat sumber daya.

Mari kita lihat dua opsi di dua subbagian berikutnya.

3.1. Menggunakan Scheduler Post Processor

Karena kita menjadwalkan metode dengan menggunakan anotasi @Scheduled , prosesor bean post ScheduledAnnotationBeanPostProcessor akan didaftarkan terlebih dahulu.

Kita bisa secara eksplisit memanggil postProcessBeforeDestruction () untuk menghancurkan kacang terjadwal yang diberikan:

@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()); }

Mempertimbangkan beberapa penjadwal, lebih baik menyimpan satu penjadwal di kelasnya sendiri, sehingga kita dapat menghentikan penjadwal tertentu sesuai kebutuhan.

3.2. Membatalkan Masa Depan yang Dijadwalkan

Cara lain untuk menghentikan penjadwal adalah secara manual membatalkan Future -nya .

Berikut penjadwal tugas khusus untuk merekam peta Masa Depan :

@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; } }

Kemudian kami mengulang peta Future dan membatalkan Future untuk penjadwal tugas batch kami:

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

Dalam kasus dengan beberapa tugas penjadwal, maka kita dapat mempertahankan peta Masa Depan di dalam kumpulan penjadwal khusus tetapi membatalkan Masa Depan yang dijadwalkan berdasarkan kelas penjadwal.

4. Kesimpulan

Dalam artikel singkat ini, kami mencoba tiga cara berbeda untuk memicu atau menghentikan pekerjaan Spring Batch terjadwal.

Saat kita perlu memulai ulang tugas batch, menggunakan tanda bersyarat untuk mengelola pekerjaan yang berjalan akan menjadi solusi yang fleksibel. Jika tidak, kami dapat mengikuti dua opsi lainnya untuk menghentikan penjadwal sepenuhnya.

Seperti biasa, semua contoh kode yang digunakan dalam artikel tersedia di GitHub.