Panduan Penjadwal Tugas Musim Semi

1. Ikhtisar

Pada artikel ini, kita akan membahas mekanisme penjadwalan tugas Spring - TaskScheduler dan implementasi yang dibuat sebelumnya bersama dengan pemicu berbeda untuk digunakan. Jika Anda ingin membaca lebih lanjut tentang penjadwalan di Spring, periksa @Async dan @Scheduled artikel.

TaskScheuler diperkenalkan di Spring 3.0 dengan berbagai metode untuk dijalankan di beberapa titik di masa depan, itu juga mengembalikan objek representasi dari antarmuka ScheduledFuture , yang dapat digunakan untuk membatalkan tugas terjadwal atau memeriksa apakah sudah selesai atau belum.

Yang perlu kita lakukan adalah memilih tugas yang dapat dijalankan untuk penjadwalan kemudian memilih kebijakan penjadwalan yang tepat.

2. ThreadPoolTaskScheduler

ThreadPoolTaskScheduler sangat cocok untuk manajemen thread internal, karena mendelegasikan tugas ke ScheduledExecutorService dan mengimplementasikan antarmuka TaskExecutor - sehingga satu instance dapat menangani potensi eksekusi asinkron serta anotasi @Scheduled .

Sekarang mari kita mendefinisikan ThreadPoolTaskScheduler kacang di ThreadPoolTaskSchedulerConfig :

@Configuration @ComponentScan( basePackages="com.baeldung.taskscheduler", basePackageClasses={ThreadPoolTaskSchedulerExamples.class}) public class ThreadPoolTaskSchedulerConfig { @Bean public ThreadPoolTaskScheduler threadPoolTaskScheduler(){ ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setPoolSize(5); threadPoolTaskScheduler.setThreadNamePrefix( "ThreadPoolTaskScheduler"); return threadPoolTaskScheduler; } }

Bean threadPoolTaskScheduler yang dikonfigurasi dapat menjalankan tugas secara tidak sinkron berdasarkan ukuran kumpulan 5 yang dikonfigurasi.

Perhatikan bahwa semua nama utas terkait ThreadPoolTaskScheduler akan diawali dengan ThreadPoolTaskScheduler .

Mari terapkan tugas sederhana yang kemudian dapat kita jadwalkan:

class RunnableTask implements Runnable{ private String message; public RunnableTask(String message){ this.message = message; } @Override public void run() { System.out.println(new Date()+" Runnable Task with "+message +" on thread "+Thread.currentThread().getName()); } } 

Kami sekarang dapat menjadwalkan tugas ini untuk dieksekusi oleh penjadwal:

taskScheduler.schedule( new Runnabletask("Specific time, 3 Seconds from now"), new Date(System.currentTimeMillis + 3000) ); 

The taskScheduler akan menjadwalkan tugas runnable ini di hari diketahui, tepat 3 detik setelah waktu saat ini.

Sekarang mari kita membahas sedikit lebih dalam dengan mekanisme penjadwalan ThreadPoolTaskScheduler .

3. Jadwalkan Tugas yang Dapat Dijalankan Dengan Penundaan Tetap

Penjadwalan dengan penundaan tetap dapat dilakukan dengan dua mekanisme sederhana:

3.1. Penjadwalan Setelah Penundaan Tetap dari Eksekusi Terjadwal Terakhir

Mari konfigurasikan tugas untuk dijalankan setelah penundaan tetap 1000 milidetik:

taskScheduler.scheduleWithFixedDelay( new RunnableTask("Fixed 1 second Delay"), 1000);

The RunnableTask akan selalu berjalan 1000 milidetik kemudian antara selesainya satu eksekusi dan awal berikutnya.

3.2. Penjadwalan Setelah Penundaan Tetap pada Tanggal Tertentu

Mari kita konfigurasikan tugas untuk dijalankan setelah penundaan tetap pada waktu mulai tertentu:

taskScheduler.scheduleWithFixedDelay( new RunnableTask("Current Date Fixed 1 second Delay"), new Date(), 1000);

The RunnableTask akan dipanggil pada saat eksekusi tertentu yang terutama waktu di mana @PostConstruct metode dimulai dan kemudian dengan 1000 milidetik delay.

4. Penjadwalan dengan Tarif Tetap

Ada dua mekanisme sederhana untuk menjadwalkan tugas yang dapat dijalankan dengan kecepatan tetap:

4.1. Menjadwalkan RunnableTask dengan Tarif Tetap

Mari jadwalkan tugas untuk dijalankan dengan kecepatan tetap dalam milidetik :

taskScheduler.scheduleAtFixedRate( new RunnableTask("Fixed Rate of 2 seconds") , 2000);

RunnableTask berikutnya akan selalu berjalan setelah 2000 milidetik tidak peduli status eksekusi terakhir yang mungkin masih berjalan.

4.2. Menjadwalkan RunnableTask pada Tarif Tetap Dari Tanggal Tertentu

taskScheduler.scheduleAtFixedRate(new RunnableTask( "Fixed Rate of 2 seconds"), new Date(), 3000);

The RunnableTask akan berjalan 3000 milidetik setelah waktu saat ini.

5. Penjadwalan dengan CronTrigger

CronTrigger digunakan untuk menjadwalkan tugas berdasarkan ekspresi cron:

CronTrigger cronTrigger = new CronTrigger("10 * * * * ?"); 

Pemicu yang disediakan dapat digunakan untuk menjalankan tugas sesuai dengan irama atau jadwal tertentu:

taskScheduler.schedule(new RunnableTask("Cron Trigger"), cronTrigger);

Dalam kasus ini, RunnableTask akan dijalankan pada detik ke-10 setiap menit.

6. Penjadwalan dengan PeriodicTrigger

Mari gunakan PeriodicTrigger untuk menjadwalkan tugas dengan penundaan tetap 2000 milidetik:

PeriodicTrigger periodicTrigger = new PeriodicTrigger(2000, TimeUnit.MICROSECONDS);

Kacang PeriodicTrigger yang dikonfigurasi akan digunakan untuk menjalankan tugas setelah penundaan tetap 2000 milidetik.

Sekarang mari kita jadwalkan RunnableTask dengan PeriodicTrigger :

taskScheduler.schedule( new RunnableTask("Periodic Trigger"), periodicTrigger);

Kita juga dapat mengonfigurasi PeriodicTrigger agar diinisialisasi pada kecepatan tetap daripada penundaan tetap, juga kita dapat menyetel penundaan awal untuk tugas terjadwal pertama dengan milidetik tertentu.

Yang perlu kita lakukan adalah menambahkan dua baris kode sebelum pernyataan return pada kacang periodicTrigger :

periodicTrigger.setFixedRate(true); periodicTrigger.setInitialDelay(1000);

Kami menggunakan metode setFixedRate untuk menjadwalkan tugas pada kecepatan tetap daripada dengan penundaan tetap, kemudian metode setInitialDelay digunakan untuk menyetel penundaan awal hanya untuk tugas runnable pertama yang dijalankan.

7. Kesimpulan

Dalam artikel singkat ini, kami telah mengilustrasikan cara menjadwalkan tugas yang dapat dijalankan menggunakan dukungan Spring untuk tugas.

Kami melihat menjalankan tugas dengan penundaan tetap, pada tarif tetap dan sesuai dengan pemicu yang ditentukan.

Dan, seperti biasa, kode ini tersedia sebagai proyek Maven di GitHub.