Anotasi @Scheduled di Musim Semi

1. Ikhtisar

Dalam tutorial ini, kami akan mengilustrasikan bagaimana anotasi Spring @Scheduled dapat digunakan untuk mengonfigurasi dan menjadwalkan tugas.

Aturan sederhana yang perlu kita ikuti untuk menganotasi metode dengan @Scheduled adalah:

  • sebuah metode harus memiliki tipe pengembalian kosong
  • sebuah metode tidak boleh menerima parameter apa pun

2. Aktifkan Dukungan untuk Penjadwalan

Untuk mengaktifkan dukungan untuk tugas penjadwalan dan anotasi @Scheduled di Spring, kita dapat menggunakan anotasi gaya aktif Java:

@Configuration @EnableScheduling public class SpringConfig { ... }

Sebaliknya, kita bisa melakukan hal yang sama di XML:

3. Jadwalkan Tugas pada Penundaan Tetap

Mari kita mulai dengan mengonfigurasi tugas untuk dijalankan setelah penundaan tetap:

@Scheduled(fixedDelay = 1000) public void scheduleFixedDelayTask() { System.out.println( "Fixed delay task - " + System.currentTimeMillis() / 1000); }

Dalam hal ini, durasi antara akhir eksekusi terakhir dan awal eksekusi berikutnya ditetapkan. Tugas selalu menunggu hingga tugas sebelumnya selesai.

Opsi ini harus digunakan jika eksekusi sebelumnya harus diselesaikan sebelum dijalankan kembali.

4. Jadwalkan Tugas dengan Tarif Tetap

Sekarang mari kita menjalankan tugas pada interval waktu yang tetap:

@Scheduled(fixedRate = 1000) public void scheduleFixedRateTask() { System.out.println( "Fixed rate task - " + System.currentTimeMillis() / 1000); }

Opsi ini harus digunakan ketika setiap eksekusi tugas bersifat independen.

Perhatikan bahwa tugas terjadwal tidak berjalan secara paralel secara default. Jadi, meskipun kita menggunakan fixedRate , tugas berikutnya tidak akan dipanggil hingga tugas sebelumnya selesai.

Jika kita ingin mendukung perilaku paralel dalam tugas terjadwal, kita perlu menambahkan anotasi @Async :

@EnableAsync public class ScheduledFixedRateExample { @Async @Scheduled(fixedRate = 1000) public void scheduleFixedRateTaskAsync() throws InterruptedException { System.out.println( "Fixed rate task async - " + System.currentTimeMillis() / 1000); Thread.sleep(2000); } }

Sekarang tugas asinkron ini akan dipanggil setiap detik, meskipun tugas sebelumnya tidak dilakukan.

5. Tarif Tetap vs Penundaan Tetap

Kita dapat menjalankan tugas terjadwal menggunakan anotasi @Scheduled Spring , tetapi berdasarkan properti fixedDelay dan fixedRate, sifat eksekusi berubah.

The fixedDelay properti memastikan bahwa ada penundaan n milidetik antara waktu selesai dari pelaksanaan tugas dan waktu mulai dari eksekusi berikutnya tugas.

Properti ini secara khusus berguna ketika kita perlu memastikan bahwa hanya satu contoh dari tugas yang berjalan sepanjang waktu. Untuk pekerjaan yang bergantung, ini cukup membantu.

The fixedRate properti menjalankan tugas yang dijadwalkan pada setiap n milidetik. Itu tidak memeriksa eksekusi tugas sebelumnya.

Ini berguna jika semua eksekusi tugas bersifat independen. Jika kami tidak berharap untuk melebihi ukuran memori dan kumpulan thread, fixedRate seharusnya cukup berguna.

Meskipun, jika tugas yang masuk tidak selesai dengan cepat, mungkin saja tugas tersebut berakhir dengan "pengecualian Memori Habis".

6. Jadwalkan Tugas Dengan Penundaan Awal

Selanjutnya, mari jadwalkan tugas dengan penundaan (dalam milidetik):

@Scheduled(fixedDelay = 1000, initialDelay = 1000) public void scheduleFixedRateWithInitialDelayTask() { long now = System.currentTimeMillis() / 1000; System.out.println( "Fixed rate task with one second initial delay - " + now); }

Perhatikan bagaimana kami menggunakan fixedDelay serta initialDelay dalam contoh ini. Tugas akan dijalankan pertama kali setelah nilai initialDelay , dan akan terus dijalankan sesuai dengan fixedDelay .

Opsi ini nyaman jika tugas memiliki penyetelan yang perlu diselesaikan.

7. Jadwalkan Tugas Menggunakan Ekspresi Cron

Terkadang penundaan dan kecepatan tidak cukup, dan kami membutuhkan fleksibilitas ekspresi cron untuk mengontrol jadwal tugas kami:

@Scheduled(cron = "0 15 10 15 * ?") public void scheduleTaskUsingCronExpression() { long now = System.currentTimeMillis() / 1000; System.out.println( "schedule tasks using cron jobs - " + now); }

Perhatikan bahwa dalam contoh ini, kami menjadwalkan tugas untuk dijalankan pada pukul 10:15 pada hari ke 15 setiap bulan.

By default, Spring will use the server's local time zone for the cron expression. However, we can use the zone attribute to change this timezone:

@Scheduled(cron = "0 15 10 15 * ?", zone = "Europe/Paris")

With this configuration, Spring will schedule the annotated method to run at 10:15 AM on the 15th day of every month in Paris time.

8. Parameterizing the Schedule

Hardcoding these schedules is simple, but we usually need to be able to control the schedule without re-compiling and re-deploying the entire app.

We'll make use of Spring Expressions to externalize the configuration of the tasks, and we'll store these in properties files.

A fixedDelay task:

@Scheduled(fixedDelayString = "${fixedDelay.in.milliseconds}")

A fixedRate task:

@Scheduled(fixedRateString = "${fixedRate.in.milliseconds}")

A cron expression based task:

@Scheduled(cron = "${cron.expression}")

9. Configuring Scheduled Tasks Using XML

Spring juga menyediakan cara XML untuk mengonfigurasi tugas yang dijadwalkan. Berikut adalah konfigurasi XML untuk menyiapkannya:

10. Kesimpulan

Dalam artikel ini, kami membahas cara mengonfigurasi dan menggunakan anotasi @Scheduled .

Kami membahas proses untuk mengaktifkan penjadwalan, dan berbagai cara untuk mengonfigurasi pola tugas penjadwalan.

Contoh yang ditunjukkan di atas dapat ditemukan di GitHub.