Kata pengantar
Fungsi tugas waktu diimplementasikan di Spring Boot. Anda dapat menggunakan penjadwalan tugas waktu yang dilengkapi dengan Spring, atau Anda dapat menggunakan kuarsa komponen open source klasik terintegrasi untuk mencapai penjadwalan tugas.
Artikel ini akan memperkenalkan secara rinci konten yang relevan tentang implementasi tugas waktunya di Spring Boot, dan membagikannya untuk referensi dan pembelajaran Anda. Saya tidak akan mengatakan banyak hal di bawah ini, mari kita lihat perkenalan terperinci bersama.
1. Timer Musim Semi
1. Metode ekspresi cron
Menggunakan tugas waktu bawaan sangat sederhana. Anda hanya perlu menambahkan anotasi seperti berikut dan tidak perlu mewarisi antarmuka pemrosesan waktu apa pun seperti kerangka kerja tugas waktu biasa. Kode contoh sederhana adalah sebagai berikut:
Paket com.power.demo.scheduledtask.simple; import com.power.demo.util.dateTimeutil; impor org.springframework.scheduling.annotation.enablescreduling; impor org.spramework.scheduling.annotation.scheduling; java.util.date;@component@enableSchedulingPublic class springTaska {/** * Referensi ekspresi cron: http://cron.qqe2.com/ **/@scheduled (cron = " */5 * * *?", zona = "GMT+8: 00") private void (void (gmt+8: 00 ") private (00") private (00 ")) } catch (Exception e) {E.PrintStackTrace (); } System.out.println (String.Format ("(TimerCron)%S Dieksekusi setiap 5 detik, logging", DateTimeutil.fmtDate (tanggal baru ())))); }} SpringTaskaDalam kode di atas, tambahkan anotasi @EnablesCheduling ke kelas, tambahkan @scheduled ke metode, konfigurasikan ekspresi cron, dan tugas timing cron paling sederhana selesai. Berikut ini adalah komponen ekspresi cron:
@Scheduled (cron = "[detik] [menit] [jam] [hari bulan] [bulan] [hari minggu] [tahun]")
2. FixedRate dan FixedDelay
Anotasi @scheduled menghilangkan ekspresi cron, dan ada metode konfigurasi lainnya, seperti FixedRate dan FixedDelay. Contoh berikut mengimplementasikan berbagai bentuk penjadwalan tugas waktu melalui metode konfigurasi yang berbeda. Kode contoh adalah sebagai berikut:
Paket com.power.demo.scheduledtask.simple; import com.power.demo.util.dateTimeutil; impor org.springframework.scheduling.annotation.enablescreduling; impor org.spramework.scheduling.annotation.scheduling; java.util.date;@component@enableSchedulingPublic class springTaskB { /*fixedRate: Jalankan lagi 5 detik setelah titik waktu terakhir* / @scheduled (fixedate = 5000) public void timerFixEdrate () {coba {thread.sleep (100); } catch (Exception e) {E.PrintStackTrace (); } System.out.println (String.Format ("(FixedRate) Waktu Saat Ini: %S", Datetimeutil.fmtDate (tanggal baru ()))); } /*FixedDelay: Jalankan 5 detik setelah titik waktu eksekusi terakhir* / @scheduled (fixedDelay = 5000) public void timerFixEddelay () {coba {thread.sleep (100); } catch (Exception e) {E.PrintStackTrace (); } System.out.println (String.Format ("(FixedDelay) Waktu Saat Ini: %S", Datetimeutil.fmtDate (tanggal baru ()))); } /*Jalankan setelah penundaan pertama adalah 2 detik, dan kemudian jalankan setiap 5 detik sesuai dengan aturan FixedDelay* / @scheduled (initialDelay = 2000, FixedDelay = 5000) public void timerInitDelay () {coba {thread.sleep (100); } catch (Exception e) {E.PrintStackTrace (); } System.out.println (string.format ("(initdelay) waktu saat ini: %s", datetimeutil.fmtdate (tanggal baru ()))); }} SpringTaskBPerhatikan perbedaan utama:
@Scheduled(fixedRate = 5000) : Jalankan lagi 5 detik setelah titik eksekusi terakhir
@Scheduled(fixedDelay = 5000) : Jalankan lagi 5 detik setelah titik waktu eksekusi terakhir
@Scheduled(initialDelay=2000, fixedDelay=5000) : Jalankan setelah penundaan pertama adalah 2 detik, dan kemudian tekan aturan FixedDelay untuk mengeksekusi setiap 5 detik
Kadang -kadang, banyak proyek perlu dikonfigurasi dan dieksekusi segera setelah tugas yang dijadwalkan dikonfigurasi, dan InitialDelay tidak diperlukan.
3. ZONA
@Scheduled Anotation juga memiliki zona atribut yang akrab, menunjukkan zona waktu. Biasanya, jika tidak ditulis, tugas waktu akan menggunakan zona waktu default server; Jika tugas Anda ingin berjalan di zona waktu tertentu dan titik waktu tertentu, misalnya, sistem multibahasa umum dapat menjalankan skrip untuk memperbarui data secara teratur, Anda dapat mengatur zona waktu, seperti zona kedelapan timur, yang dapat diatur ke:
zone = "GMT+8:00"
2. Kuarsa
Kuarsa adalah salah satu kerangka penjadwalan tugas open source yang paling banyak digunakan, dan banyak perusahaan menerapkan sistem manajemen tugas waktu mereka sendiri berdasarkan padanya. Kuarsa menyediakan dua pemicu tugas waktu yang paling umum digunakan, yaitu Simpletrigger dan Crontrigger. Artikel ini mengambil crontrigger yang paling banyak digunakan sebagai contoh.
1. Tambahkan dependensi
<dependency> <GroupId> org.quartz-Scheduler </groupid> <ArTifactId> quartz </artifactid> <version> 2.3.0 </version> </dependency>
2. Konfigurasikan Ekspresi Cron
Seperti yang diperlukan untuk kode sampel, tambahkan konfigurasi berikut ke file application.properties:
## Quartz Timed Job Configuration Job.taska.cron = */3 * * * *? Job.taskb.cron = */7 * * * *? Job.taskmail.cron = */5 * * *? Job.taskmail.cron = */5 * * *?
Bahkan, kita dapat menulisnya dalam kode atau bertahan di DB dan kemudian membacanya tanpa mengonfigurasinya.
3. Tambahkan tugas waktu untuk diimplementasikan
Tugas 1:
Paket com.power.demo.scheduledtask.quartz; import com.power.demo.util.dateTimeutil; impor org.quartz.disallowConcurrentExecution; impor org.quartz.job; impor org.quartz.jobexecutioncution; impor org.quartz.job; Impor org.quartz.jobexecutionContext; impor org.quartz. java.util.date; @disallowConcurrentExecutionPublic kelas QuartzTaska mengimplementasikan Job {@Override public void execute (jobexecutionContext var1) melempar JobExecutionException {try {thread.sleep (1); } catch (Exception e) {E.PrintStackTrace (); } System.out.println (String.Format ("(QuartzTaska)%S Dieksekusi setiap 3 detik, log log", datetimeutil.fmtdate (tanggal baru ())))); }} QuartztaskaTugas 2:
Paket com.power.demo.scheduledtask.quartz; import com.power.demo.util.dateTimeutil; impor org.quartz.disallowConcurrentExecution; impor org.quartz.job; impor org.quartz.jobexecutioncution; impor org.quartz.job; Impor org.quartz.jobexecutionContext; impor org.quartz. java.util.date; @disallowConcurrentExecutionPublic kelas quartzTaskB mengimplementasikan pekerjaan {@Override public void mengeksekusi (jobexecutionContext var1) melempar JobExecutionException {try {thread.sleep (100); } catch (Exception e) {E.PrintStackTrace (); } System.out.println (String.Format ("(QuartzTaskB)%S Dieksekusi setiap 7 detik, log log", Datetimeutil.fmtdate (tanggal baru ())))); }} QuartzTaskBKirim Tugas Email Tepat Waktu:
Paket com.power.demo.scheduledtask.quartz; import com.power.demo.service.contract.mailservice; import com.power.demo.util.dateTimeutil; import com.power.demo.util.powerlogger; impor org.joda.time.datime; org.quartz.disallowConcurrentExecution; impor org.quartz.job; impor org.quartz.jobexecutionContext; impor org.quartz.jobexecutionException; impor org.springframework.deans.factory.annotation MailsendTask mengimplementasikan pekerjaan {@autowired private mailService mailService; @Override public void execute (jobexecutionContext var1) melempar JobExecutionException {System.out.println (string.format ("(mailsendTask)%s Kirim surat setiap 5 detik", datetimeutil.fmtdate (tanggal baru ())))); coba {//thread.sleep(1); Datetime dtnow = datetime baru (tanggal baru ()); Tanggal startTime = dtnow.minusmonths (1) .todate (); // Sebulan yang lalu tanggal endtime = dtnow.plusdays (1) .todate (); MailService.Autosend (StartTime, Endtime); Powerlogger.info (string.format ("Kirim surat, waktu mulai: %s, waktu akhir: %s", datetimeutil.fmtdate (startTime), datetimeutil.fmtdate (endtime))); } catch (Exception e) {E.PrintStackTrace (); Powerlogger.info (string.format ("Kirim surat, pengecualian terjadi: %s, waktu akhir: %s", e)); }}} MailsendTaskMenerapkan tugas terlihat sangat sederhana, hanya mewarisi antarmuka pekerjaan Quartz dan menulis ulang metode eksekusi.
4. Mengintegrasikan tugas waktu kuarsa
Bagaimana cara membuat Spring secara otomatis mengenali inisialisasi instance tugas waktu kuarsa? Ini membutuhkan mengacu pada kacang yang dikelola musim semi, mengekspos kacang yang diperlukan ke wadah musim semi, dan secara otomatis menyuntikkannya dengan mendefinisikan pabrik pekerjaan.
Pertama, tambahkan Kelas Pabrik Pekerjaan yang disuntikkan Spring:
Paket com.power.demo.scheduledtask.quartz.config; impor org.quartz.spi.triggerfiredBundle; impor org.springframework.beans.factory.config.AutowireCapableBeanFactory; impor org.spramework.context.contextextextext.contextextextext.contextextextextextextext.context.contextxtext; org.springframework.context.applicationContextAware; impor org.springframework.scheduling.quartz.springbeansjoBfactory; public class final autowireBeANJobFactory mengimplementasikan application {private transient neutowapory; /*** Spring menyediakan mekanisme yang memungkinkan Anda untuk mendapatkan ApplicationContext, yaitu, ApplicationContextAware Interface* untuk kelas yang mengimplementasikan antarmuka ApplicationContextAware, Spring akan membuat instantiasi dan menyebutnya* public voidsetApplicationContext (ApplicationContext ApplicationContext) melempar BeanSException; antarmuka, * lulus konteks tempat kacang itu berasal. **/ @Override public void setApplicationContext (Final ApplicationContext Context) {beanFactory = context.getAutoWirecAbleBeanFactory (); } @Override Obyek Protected CreateJoBinStance (Final TriggerFiredBundle Bundle) melempar Exception {Final Object Job = Super.CreateJobInstance (bundel); beanfactory.autoweBean (pekerjaan); pekerjaan kembali; }} AutoWireBeJobFactoryTentukan kuarsaconfig:
Paket com.power.demo.scheduledtask.quartz.config; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.beans.factory.annotation.qualifier; impor org.springfrnework.context.context.contexrann.bealifier; impor org.springfrnework.contexrn.context.contexrn.contexrn.contexrn.contexrn.contexrn.contexrn.contexn.bealifier; org.springfran.contexrn.contexrn.contexrn.contexrn.contexrn.contexrn.contexrn.contexrn.contexrn.contexrn.contexrn.beotation.beaner; org.springframework.context.annotation.configuration; impor org.springframework.scheduling.quartz.crontriggerFactorybean; impor org.springframework.scheduling.quartz.schedulerFactoryBean; @configurationpuburation classcuburation classcuburation @Qualifier ("Quartztaskatrigger") Private CrontriggerFactoryBean Quartztaskatrigger; @Autowired @qualifier ("QuartzTaskBtrigger") Private CrontriggerFactoryBean QuartzTaskBtrigger; @Autowired @qualifier ("mailsendtrigger") private crontriggerFactoryBean mailsendtrigger; // Pekerjaan di Quartz secara otomatis menyuntikkan objek yang diselenggarakan oleh Spring Container @Bean Public AutoWireBeJobFactory AutoWiringspringBeanjoBfactory () {return new AutoWireBeJoBFactory (); } @Bean Public SchedulerFactoryBean JadwalFactoryBean () {SCRECTERERFACTORYBEAN SCRECTERER = NEW NEWNYFACTORYBEAN (); scheduler.setjoBfactory (AutoWiringspringBeanjoBfactory ()); // Konfigurasikan kelas pekerjaan yang disuntikkan oleh Spring // Atur crontriggerFactoryBean dan atur jadwal pemicu tugas.setTriggers (quartztaskatrigger.getObject (), quartztaskbtrigger.getObject (), mailsendtrigger.getObject ()); Return Scheduler; }} QuartzconfigSelanjutnya, konfigurasikan detail pekerjaan:
package com.power.demo.scheduledtask.quartz.config;import com.power.demo.util.ConfigUtil;import com.power.demo.scheduledtask.quartz.MailSendTask;import com.power.demo.scheduledtask.quartz.QuartzTaskA;import com.power.demo.scheduledtask.quartz.quartztaskb; import com.power.demo.util.configutil; impor org.springframework.context.annotation.bean; impor org.springframework.context.annotation.onfiguration; org.springframework. // Hasilkan JobDetail JobDetailFactoryBean Factory = new jobDetailFactoryBean (); factory.setjobclass (quartztaska.class); // Atur pekerjaan yang sesuai. EsetGroup ("QuartzTaskGroup"); factory.setname ("quartztaskajob"); factory.setDurability (false); factory.setDescription ("Tes Task A"); Pabrik Kembali; } @Bean (name = "quartztaskatrigger") crontriggerFactoryBean crontriggerAfactoryBean () {string cron = configutil.getConfigVal (appield.job_taska_cron); CrontriggerFactoryBean stfactory = crontriggerFactoryBean baru (); // atur jobdetail stfactory.setjoBdetail (jobdetailAfactoryBean (). GetObject ()); stfactory.setStartDelay (1000); stfactory.setname ("quartztaskatrigger"); stfactory.setGroup ("QuartzTaskGroup"); stfactory.setCronexpression (cron); mengembalikan stfactory; } @Bean (name = "quartztaskb") public jobDetailFactoryBean jobDetailBfactoryBean () {// menghasilkan jobdetail jobdetailFactoryBean factory = new jobdetailFactoryBean (); factory.setjobclass (quartztaskb.class); // Atur pekerjaan yang sesuai. EsetGroup ("QuartzTaskGroup"); factory.setname ("quartztaskbjob"); factory.setDurability (false); factory.setDescription ("Tes Task B"); Pabrik Kembali; } @Bean (name = "QuartzTaskBtrigger") Public CrontriggerFactoryBean CrontrigriggeBfactoryBean () {String Cron = configutil.getConfigVal (appield.job_taskb_cron); CrontriggerFactoryBean stfactory = crontriggerFactoryBean baru (); // atur jobdetail stfactory.setjoBdetail (jobdetailbfactorybean (). GetObject ()); stfactory.setStartDelay (1000); stfactory.setname ("QuartzTaskBtrigger"); stfactory.setGroup ("QuartzTaskGroup"); stfactory.setCronexpression (cron); mengembalikan stfactory; } @Bean (name = "mailsendTask") Public jobDetailFactoryBean jobDetailMailFactoryBean () {// menghasilkan jobdetail jobdetailFactoryBean factory = new jobdetailFactoryBean (); factory.setjobclass (mailsendTask.class); // Atur pekerjaan yang sesuai. EsetGroup ("QuartzTaskGroup"); factory.setname ("mailsendtaskjob"); factory.setDurability (false); factory.setDescription ("mailsendtrigger"); Pabrik Kembali; } @Bean (name = "mailsendtrigger") public crontriggerFactoryBean crontriggerMailFactoryBean () {string cron = configutil.getConfigVal (appield.job_taskmail_cron); CrontriggerFactoryBean stfactory = crontriggerFactoryBean baru (); // atur jobdetail stfactory.setjoBdetail (jobdetailMailFactoryBean (). GetObject ()); stfactory.setStartDelay (1000); stfactory.setname ("mailsendtrigger"); stfactory.setGroup ("QuartzTaskGroup"); stfactory.setCronexpression (cron); mengembalikan stfactory; }} TasksettingAkhirnya, mulailah aplikasi tugas timing boot Anda, dan tugas waktu yang lengkap berdasarkan jadwal kuarsa akan diimplementasikan.
Dalam contoh tugas yang tepat waktu ini, ada surat -surat yang mengirim surat tugas MailsendTask. Artikel berikutnya akan membagikan sistem surat sederhana dalam aplikasi boot musim semi menggunakan MongoDB sebagai media penyimpanan.
Bacaan Diperpanjang:
Banyak perusahaan memiliki kerangka dan sistem penjadwalan tugas waktu sendiri. Bagaimana cara mengintegrasikan cluster kuarsa di Spring Boot untuk mengimplementasikan konfigurasi tugas waktu yang dinamis?
Lihat:
//www.vevb.com/article/139591.htm
//www.vevb.com/article/139597.htm
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.