latar belakang
Selama pengembangan proyek, kita sering perlu melakukan tugas -tugas berkala. Ini dapat membantu kita mencapainya dengan baik melalui tugas waktu.
Mari kita bandingkan beberapa kerangka kerja tugas yang umum digunakan:
Seperti yang dapat dilihat dari tabel di atas, kerangka kerja jadwal musim semi memiliki fungsi lengkap dan sederhana dan mudah digunakan. Jadwal musim semi sepenuhnya memenuhi syarat untuk proyek kecil dan menengah.
1. Jadwal Integrasi Springboot
1.1 Menambahkan Paket Ketergantungan Maven
Karena jadwal musim semi termasuk dalam modul dasar pegas-boot-starter, tidak diperlukan dependensi tambahan.
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependensi>
1.2 Mulai kelas, tambahkan anotasi startup
Menambahkan anotasi @EnablesCheduling ke entri springboot atau kelas konfigurasi dapat mengaktifkan tugas waktu.
@EnableScheduling@springbootApplicationPublic class classeApplication {public static void main (string [] args) {springApplication.run (schedululeApplication.class, args);}}1.3. Tambahkan tugas waktunya
Kami akan memberikan contoh dari tiga penjadwal tugas jadwal musim semi.
1.3.1 Ekspresi Cron
Mirip dengan aturan definisi waktu ekspresi cron di bawah Linux. Ekspresi cron terdiri dari 6 atau 7 ruang yang dipisahkan oleh bidang waktu, seperti yang ditunjukkan pada gambar di bawah ini:
Ekspresi Umum:
Ambil kastanye:
Tambahkan metode kerja (), yang dieksekusi setiap 10 detik.
Catatan: Ketika waktu eksekusi metode melebihi frekuensi penjadwalan tugas, penjadwal akan dieksekusi dalam siklus berikutnya.
Sebagai contoh: dengan asumsi bahwa metode Work () mulai dieksekusi pada detik ke -0 dan metode dieksekusi selama 12 detik, lalu pada waktu berikutnya metode Work () dieksekusi adalah detik ke -20.
@ComponentPublic Class myTask {@scheduled (cron = "0/10 * * * * *") public void work () {// logika eksekusi tugas}}1.3.2 Tugas Interval Tetap
Waktu eksekusi tugas berikutnya dihitung dari akhir waktu eksekusi tugas terakhir dari metode ini. Dan mulai eksekusi tugas berkala dengan aturan ini.
Ambil kastanye:
Tambahkan metode kerja () dan jalankan setiap 10 detik.
Sebagai contoh: Misalkan metode Work () mulai dieksekusi pada detik ke -0 dan metode dieksekusi selama 12 detik, lalu waktu berikutnya metode Work () dieksekusi adalah detik ke -22.
@Scheduled (fixedDelay = 1000*10) public void work () {// Logika Eksekusi Tugas}1.3.3 Tugas frekuensi tetap
Jalankan tugas pada frekuensi yang ditentukan dan mulai pelaksanaan penjadwalan secara berkala dengan aturan ini.
Ambil kastanye:
Tambahkan metode kerja (), yang dieksekusi setiap 10 detik.
Catatan: Ketika waktu eksekusi metode melebihi frekuensi penjadwalan tugas, penjadwal akan menjalankan tugas berikutnya segera setelah metode saat ini dijalankan.
Sebagai contoh: Misalkan metode Work () mulai dieksekusi pada detik ke -0 dan metode dieksekusi selama 12 detik, lalu waktu berikutnya metode kerja () dieksekusi adalah detik ke -12.
@Scheduled (fixedRate = 1000*10) public void work () {// logika eksekusi tugas}2. Konfigurasikan kumpulan utas TasksCheduler
Dalam proyek aktual, sistem kami dapat mendefinisikan beberapa tugas waktu. Kemudian beberapa tugas waktu dapat dilakukan secara independen dan secara paralel.
Dengan melihat org.springframework. Ini bisa berakibat fatal bagi multitasking kami. Ketika beberapa tugas dieksekusi secara bersamaan (atau perlu dieksekusi pada saat yang sama), penjadwal tugas akan mengalami penyimpangan waktu dan waktu pelaksanaan tugas tidak pasti.
void scheduletasks () yang dilindungi () {if (this.taskscheduler == null) {this.localexecutor = executors.newsinglethreadschedulededexecutor (); this.taskscheduler = new concurrentTaskscheduler (this.localexecutor);} // oMit ...}2.1 kumpulan utas khusus
Menambahkan kelas konfigurasi untuk mengimplementasikan antarmuka penjadwalan konfigurasi. Tulis ulang metode ConfigureTasks dan atur kumpulan utas khusus melalui TaskRegistrar.
@ConfigurationPublic kelas jadwalconfig mengimplementasikan jadwalconfigurer {@Overridepublic void configureTasks (schedulededTaskRar TaskRegistrar) {TaskRegistrar.setscheduler (taskexecutor ());}@bean (nodamethod = "shutdown") (TaskExecutor ());}@bean (nodaMetheThod = "shutdown") Executors.NewsCheduledThreadPool (20);}}3. Masalah dalam aplikasi praktis
3.1 Masalah startup dan shutdown dalam aplikasi web
Kita tahu bahwa kacang dimuat atau diinisialisasi melalui pegas akan secara otomatis diturunkan (dihancurkan) ketika layanan dihentikan. Namun, karena utas adalah tingkat JVM, jika pengguna memulai utas dalam aplikasi web, siklus hidup utas ini tidak akan konsisten dengan aplikasi web. Dengan kata lain, bahkan jika aplikasi web berhenti, utasnya masih tidak berakhir (kematian).
Larutan:
1) Objek saat ini diinisialisasi melalui pegas
Saat musim semi menghapus instalasi (menghancurkan) sebuah instance, metode hancur dari instance akan dipanggil. Diimplementasikan dengan mengimplementasikan metode penghancuran antarmuka sekali pakai. Secara aktif tutup utas dalam metode Destroy.
@Componentpublic class MyTask implements DisposableBean{@Overridepublic void destroy() throws Exception {//Close the thread or thread pool ThreadPoolTaskScheduler scheduler = (ThreadPoolTaskScheduler)applicationContext.getBean("scheduler");scheduler.shutdown();}//Omit...}2) Objek saat ini tidak diinisialisasi (dikelola) melalui pegas
Kemudian kita dapat menambahkan pendengar konteks servlet untuk secara aktif menutup utas ketika layanan servlet dihentikan.
kelas publik mytaskListenter mengimplementasikan servletcontextListener {@Overridepublic void contextDestroyed (servletContextEvent arg0) {// tutup utas atau utas} // omit ...}3.2 Masalah Penempatan Terdistribusi
Dalam proyek aktual, sistem kami biasanya akan digunakan dalam kelompok, didistribusikan atau pemulihan bencana. Maka tugas waktu mungkin memiliki masalah konkurensi, yaitu, tugas yang sama berjalan di banyak server pada saat yang sama.
Solusi (Kunci Terdistribusi):
1) Kunci melalui tabel database
2) cache middleware
3) diimplementasikan melalui ZooKeeper
Meringkaskan:
Jadwal musim semi memberi kami kerangka kerja tugas waktu yang sederhana, cepat, efisien, dan stabil. Namun, perlu untuk mempertimbangkan siklus hidup utas dan masalah penyebaran yang didistribusikan.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.