Anotasi @Jadual pada Musim Bunga

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan menggambarkan bagaimana anotasi Spring @Schedched boleh digunakan untuk mengkonfigurasi dan menjadualkan tugas.

Peraturan mudah yang perlu kita ikuti untuk memberi penjelasan mengenai kaedah dengan @Schedched adalah:

  • kaedah harus mempunyai jenis pengembalian yang tidak sah
  • kaedah tidak boleh menerima sebarang parameter

2. Aktifkan Sokongan untuk Penjadualan

Untuk mengaktifkan sokongan untuk menjadwalkan tugas dan anotasi @Jadual pada musim bunga, kami dapat menggunakan anotasi gaya aktif Java:

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

Sebaliknya, kita boleh melakukan perkara yang sama dalam XML:

3. Jadualkan Tugas pada Kelewatan Tetap

Mari mulakan dengan mengkonfigurasi tugas yang akan dijalankan setelah penangguhan tetap:

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

Dalam kes ini, jangka masa antara akhir pelaksanaan terakhir dan permulaan pelaksanaan seterusnya ditetapkan. Tugas sentiasa menunggu sehingga yang sebelumnya selesai.

Pilihan ini harus digunakan apabila wajib agar pelaksanaan sebelumnya selesai sebelum dijalankan lagi.

4. Jadualkan Tugas dengan Kadar Tetap

Sekarang mari kita laksanakan tugas pada selang waktu yang tetap:

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

Pilihan ini harus digunakan apabila setiap pelaksanaan tugas adalah bebas.

Perhatikan bahawa tugas yang dijadualkan tidak berjalan secara selari secara lalai. Oleh itu, walaupun kita menggunakan fixedRate , tugas seterusnya tidak akan dipanggil sehingga yang sebelumnya selesai.

Sekiranya kita ingin menyokong tingkah laku selari dalam tugas yang dijadualkan, 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 tidak segerak ini akan dipanggil setiap saat, walaupun tugas sebelumnya tidak dilakukan.

5. Kadar Tetap vs Kelewatan Tetap

Kami dapat menjalankan tugas yang dijadualkan menggunakan anotasi @Schedched Spring , tetapi berdasarkan sifat fixedDelay dan fixedRate, sifat pelaksanaan berubah.

The fixedDelay harta akan memastikan bahawa terdapat kelewatan n milisaat antara masa penamat yang pelaksanaan tugas dan masa mula pelaksanaan seterusnya tugas.

Properti ini berguna secara khusus apabila kita perlu memastikan bahawa hanya satu tugas yang dijalankan sepanjang masa. Untuk pekerjaan bergantung, sangat membantu.

The fixedRate harta berjalan tugas yang dijadualkan pada setiap n milisaat. Ia tidak memeriksa pelaksanaan tugas sebelumnya.

Ini berguna apabila semua pelaksanaan tugas adalah bebas. Sekiranya kita tidak mengharapkan melebihi ukuran memori dan kumpulan utas , fixedRate harus cukup berguna.

Walaupun, jika tugas masuk tidak selesai dengan cepat, ada kemungkinan mereka berakhir dengan "Pengecualian Memori".

6. Jadualkan Tugas Dengan Kelewatan Awal

Seterusnya, mari menjadualkan tugas dengan kelewatan (dalam milisaat):

@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 kita menggunakan fixedDelay dan juga awalDelay dalam contoh ini. Tugas tersebut akan dilaksanakan pertama kali setelah nilai awalDelay , dan akan terus dilaksanakan sesuai dengan fixedDelay .

Pilihan ini sesuai apabila tugas mempunyai persediaan yang perlu diselesaikan.

7. Jadualkan Tugas Menggunakan Ekspresi Cron

Kadang-kadang kelewatan dan kadar tidak mencukupi, dan kita memerlukan fleksibiliti ekspresi cron untuk mengawal jadual tugas kita:

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

Perhatikan bahawa dalam contoh ini, kami menjadualkan tugas yang akan dilaksanakan pada pukul 10:15 pagi pada hari ke-15 setiap bulan.

Secara lalai, Spring akan menggunakan zon waktu tempatan pelayan untuk ungkapan cron. Namun, kita dapat menggunakan atribut zon untuk mengubah zon waktu ini :

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

Dengan konfigurasi ini, Spring akan menjadualkan kaedah anotasi untuk dijalankan pada pukul 10:15 pagi pada hari ke-15 setiap bulan pada waktu Paris.

8. Parameterisasi Jadual

Pengkodan jadual ini adalah mudah, tetapi biasanya kita harus dapat mengawal jadual tanpa menyusun semula dan menyebarkan semula keseluruhan aplikasi.

Kami akan menggunakan Spring Expressions untuk mengeksternalisasi konfigurasi tugas, dan kami akan menyimpannya dalam fail sifat.

A fixedDelay tugasan:

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

A fixedRate tugasan:

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

A cron tugas ungkapan berdasarkan:

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

9. Mengkonfigurasi Tugas Berjadual Menggunakan XML

Spring juga menyediakan cara XML untuk mengkonfigurasi tugas yang dijadualkan. Berikut adalah konfigurasi XML untuk menetapkannya:

10. Kesimpulannya

Dalam artikel ini, kami membincangkan cara mengkonfigurasi dan menggunakan penjelasan @Jadual .

Kami merangkumi proses untuk membolehkan penjadualan, dan pelbagai cara mengkonfigurasi pola tugas penjadualan.

Contoh yang ditunjukkan di atas boleh didapati di GitHub.