Panduan untuk Penjadual Tugas Musim Semi

1. Gambaran keseluruhan

Dalam artikel ini, kita akan membincangkan mekanisme penjadualan tugas Musim Semi - TaskScheduler dan pelaksanaannya yang telah dibina sebelumnya bersama dengan pencetus yang berbeza untuk digunakan. Jika anda ingin membaca lebih lanjut mengenai penjadualan dalam Spring, daftar @Async dan @Scheduled artikel.

TaskScheuler diperkenalkan pada Spring 3.0 dengan pelbagai kaedah untuk menjalankan pada satu ketika pada masa akan datang, ia juga mengembalikan objek perwakilan ScheduledFuture antara muka, yang boleh digunakan untuk membatalkan tugas berjadual atau memeriksa jika ia dilakukan atau tidak.

Yang perlu kita lakukan ialah memilih tugas yang dapat dijalankan untuk penjadualan dan kemudian memilih polisi penjadualan yang tepat.

2. ThreadPoolTaskScheduler

ThreadPoolTaskScheduler adalah amat sesuai untuk pengurusan thread dalaman, kerana ia perwakilan tugasan ke ScheduledExecutorService dan alat-alat yang TaskExecutor antara muka - supaya contoh tunggal ia mampu untuk mengendalikan hukuman potensi tak segerak serta @Scheduled anotasi.

Sekarang mari kita menentukan 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; } }

Benang kacang yang dikonfigurasiPoolTaskScheduler dapat melaksanakan tugas secara asinkron berdasarkan ukuran kolam yang dikonfigurasi 5.

Perhatikan bahawa semua ThreadPoolTaskScheduler nama thread berkaitan akan dimulakan dengan nombor ThreadPoolTaskScheduler .

Mari laksanakan tugas mudah yang boleh kita jadualkan:

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

Kita sekarang dapat menjadualkan tugas ini dengan mudah untuk dilaksanakan oleh penjadual:

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

The taskScheduler akan menjadualkan tugas runnable ini pada satu tarikh yang diketahui, betul-betul 3 saat selepas masa semasa.

Sekarang mari kita pergi lebih mendalam dengan mekanisme penjadualan ThreadPoolTaskScheduler .

3. Jadualkan Tugas yang Boleh Dijalankan Dengan Kelewatan Tetap

Penjadualan dengan kelewatan tetap dapat dilakukan dengan dua mekanisme mudah:

3.1. Penjadualan Selepas Kelewatan Tetap Pelaksanaan Berjadual Terakhir

Mari konfigurasikan tugas yang akan dijalankan setelah penangguhan tetap 1000 milisaat:

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

The RunnableTask akan sentiasa berjalan 1000 milisaat kemudian antara selesainya satu pelaksanaan dan permulaan seterusnya.

3.2. Penjadualan Selepas Kelewatan Tetap pada Tarikh Tertentu

Mari kita konfigurasikan tugas yang akan dijalankan setelah kelewatan tetap pada waktu permulaan tertentu:

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

The RunnableTask akan dimulakan pada masa pelaksanaan yang tertentu yang kebanyakannya masa di mana @PostConstruct Cara mula dibina dan kemudiannya dengan 1000 milisaat.

4. Penjadualan dengan Kadar Tetap

Terdapat dua mekanisme mudah untuk menjadualkan tugas yang dapat dijalankan dengan kadar tetap:

4.1. Menjadualkan RunnableTask dengan Kadar Tetap

Mari menjadualkan tugas untuk dijalankan pada kadar milisaat tetap :

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

RunnableTask seterusnya akan berjalan selalu selepas 2000 milisaat tidak kira status pelaksanaan terakhir yang mungkin masih berjalan.

4.2. Menjadualkan RunnableTask pada Kadar Tetap Dari Tarikh yang Diberikan

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

The RunnableTask akan berjalan 3000 milisaat selepas masa semasa.

5. Penjadualan dengan CronTrigger

CronTrigger digunakan untuk menjadualkan tugas berdasarkan ekspresi cron:

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

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

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

Dalam kes ini, RunnableTask akan dilaksanakan pada detik ke-10 setiap minit.

6. Penjadualan dengan PeriodicTrigger

Mari gunakan PeriodicTrigger untuk menjadualkan tugas dengan kelewatan tetap 2000 milisaat:

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

Bean PeriodicTrigger yang dikonfigurasi akan digunakan untuk menjalankan tugas setelah penundaan tetap 2000 milisaat.

Sekarang mari kita jadualkan RunnableTask dengan PeriodicTrigger :

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

Kita juga dapat mengkonfigurasi PeriodicTrigger agar diinisialisasi pada kadar tetap dan bukannya kelewatan tetap, juga kita dapat menetapkan penundaan awal untuk tugas pertama yang dijadualkan oleh milidetik tertentu.

Yang perlu kita buat hanyalah menambahkan dua baris kod sebelum penyataan penyata pada bean periodicTrigger :

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

Kami menggunakan kaedah setFixedRate untuk menjadualkan tugas pada kadar tetap dan bukannya dengan kelewatan tetap, kemudian kaedah setInitialDelay digunakan untuk menetapkan penundaan awal hanya untuk tugas pertama yang dapat dijalankan.

7. Kesimpulannya

Dalam artikel ringkas ini, kami telah menggambarkan bagaimana menjadualkan tugas yang dapat dijalankan menggunakan sokongan Spring untuk tugas.

Kami melihat menjalankan tugas dengan kelewatan tetap, pada kadar tetap dan mengikut pencetus yang ditentukan.

Dan, seperti biasa, kodnya tersedia sebagai projek Maven di GitHub.