Cara Mencetuskan dan Menghentikan Pekerjaan Spring Batch yang Dijadualkan

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan menyiasat dan membandingkan pelbagai cara untuk mencetuskan dan menghentikan pekerjaan Spring Batch yang dijadualkan untuk sebarang kes perniagaan yang diperlukan.

Sekiranya anda memerlukan pengenalan mengenai Spring Batch dan Penjadual, sila baca artikel Spring-Batch dan Spring-Scheduler.

2. Mencetuskan Kerja Musim Bunga Berjadual

Pertama, kami mempunyai kelas SpringBatchScheduler untuk mengkonfigurasi penjadualan dan kerja kumpulan. Kaedah launchJob () akan didaftarkan sebagai tugas yang dijadualkan.

Selanjutnya, untuk mencetuskan pekerjaan Spring Batch yang dijadualkan dengan cara yang paling intuitif, mari kita tambahkan bendera bersyarat untuk mengaktifkan tugas hanya apabila bendera ditetapkan ke benar:

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)

Pemboleh ubah batchRunCounter akan digunakan dalam ujian integrasi untuk mengesahkan apakah tugas kumpulan telah dihentikan.

3. Hentikan Kerja Spring Batch yang Dijadualkan

Dengan bendera bersyarat di atas, kami dapat mencetuskan tugas Spring Batch yang dijadualkan dengan tugas dijadualkan.

Sekiranya kita tidak perlu menyambung semula pekerjaan, maka kita sebenarnya dapat menghentikan tugas yang dijadualkan untuk menjimatkan sumber.

Mari kita lihat dua pilihan dalam dua bahagian berikutnya.

3.1. Menggunakan Pemproses Pos Penjadual

Oleh kerana kami menjadualkan kaedah dengan menggunakan penjelasan @Schedched , pemproses pasca kacang dijadualkanAnnotationBeanPostProcessor akan didaftarkan terlebih dahulu.

Kami secara terang-terangan memanggil postProcessBeforeDestruction () untuk memusnahkan kacang dijadualkan 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()); }

Dengan mempertimbangkan beberapa penjadwalan, lebih baik menyimpan satu penjadwal di kelasnya sendiri, sehingga kita dapat menghentikan penjadwal tertentu yang diperlukan.

3.2. Membatalkan Masa Depan yang Dijadualkan

Cara lain untuk menghentikan penjadual adalah membatalkan Masa Depan secara manual .

Berikut penjadual tugas khusus untuk menangkap 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 mengulangi peta Masa Depan dan membatalkan Masa Depan untuk penjadwalan pekerjaan kumpulan kami:

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

Dalam kasus dengan banyak tugas penjadwalan, maka kita dapat mempertahankan peta Masa Depan di dalam kumpulan penjadwal kustom tetapi membatalkan Masa Depan berjadual yang sesuai berdasarkan kelas penjadwal.

4. Kesimpulan

Dalam artikel ringkas ini, kami mencuba tiga cara berbeza untuk mencetuskan atau menghentikan kerja Spring Batch yang dijadualkan.

Apabila kita perlu memulakan semula pekerjaan batch, menggunakan bendera bersyarat untuk menguruskan pekerjaan akan menjadi penyelesaian yang fleksibel. Jika tidak, kita boleh mengikuti dua pilihan lain untuk menghentikan penjadual sepenuhnya.

Seperti biasa, semua contoh kod yang digunakan dalam artikel boleh didapati di GitHub.