Spring Cloud 2.x serisi springboot entegre kuvars
Bir proje üzerinde çalışırken, belirli bir zamanda ne yapılması gerektiği, kaç saniye olması gerektiği gibi bazen zamanlayıcı görevleri vardır. Zamanlama görevleri için yaygın olarak kullanılan iş senaryosu veri istatistikleridir. Bahar, birden fazla zamanlama görevinin gerçekleştirilmesini destekler.Bugün, yaylı zamanlayıcı ve kuvars zamanlayıcı kullanımını tanıtacağım. Bir, yaylı zamanlayıcı
Spring, zamanlayıcıları destekleyen görev uygulamasıyla birlikte gelir. Basit konfigürasyonla zamanlama görevlerini gerçekleştirebilir. Aşağıdaki iki ek açıklama esas olarak kullanılır:
@EnableScheduling: zamanlanmış görevleri başlatmak için işaretleyin
@Scheduled: Zamanlanmış bir görev tanımlayın
Genel talimatlar:
@Scheduled (fixedRate = 2000): son yürütme zamanından 2 saniye sonra tekrar çalıştırın
@Scheduled (fixedDelay = 2000): son yürütme zamanından 2 saniye sonra tekrar çalıştırın
@Scheduled (initialDelay = 1000, fixedDelay = 2000): İlk yürütme 1 saniye geciktirilir ve ardından son yürütme zaman noktasından 2 saniye sonra tekrar yürütülür
@Scheduled (cron = "** * * *?"): Cron kurallarına göre çalıştırın
İki, kuvars zamanlama görevi
Quzrtz esas olarak aşağıdaki kavramları anlar:
Job: Yalnızca bir yöntem geçersiz yürütme (JobExecutionContext bağlamı) içeren bir arabirimdir.Geliştiriciler bu arabirimi çalışan görevleri tanımlamak için uygular.JobExecutionContext sınıfı, zamanlama bağlamı hakkında çeşitli bilgiler sağlar. İş çalışırken elde edilen bilgiler JobDataMap örneğinde saklanır.
JobDetail: Quartz, bir İşi her yürüttüğünde bir İş örneğini yeniden oluşturur, bu nedenle bir İş örneğini doğrudan kabul etmez, bunun yerine çalışma zamanında newInstance () 'in yansıtma mekanizmasıyla başlatılabilmesi için bir İş uygulama sınıfı alır. Bu nedenle, İşin uygulama sınıfını ve iş adı, açıklaması ve ilişkili dinleyici bilgileri gibi diğer ilgili statik bilgileri açıklamak için bir sınıfa ihtiyaç vardır.JobDetail bu rolü üstlenir.
Tetik: İşin yürütülmesini tetikleyen zaman tetikleme kurallarını tanımlayan bir sınıftır. Temel olarak iki alt sınıf vardır, SimpleTrigger ve CronTrigger. Yalnızca bir kez tetiklenmesi veya belirli bir zaman aralığında periyodik olarak çalıştırılması gerektiğinde, SimpleTrigger en uygun seçimdir; CronTrigger ise Cron ifadeleri aracılığıyla çeşitli karmaşık zaman kuralları çizelgeleme şemalarını tanımlayabilir: örneğin her sabah, pazartesi ve çarşamba her 1: 00'de uygulama , Cuma öğleden sonra infaz vb .;
Takvim: org.quartz.Calendar, java.util.Calendar'dan farklıdır. Zaman içindeki belirli takvim noktalarının bir toplamıdır (org.quartz.Calendar'ı java.util.Calendar-java.util.Calendar'ın bir koleksiyonu olarak düşünebilirsiniz. Bir takvim zaman noktasını ve org.quartz.Calendar olduktan sonraki takvimi özel talimatlar olmadan temsil eder). Bir Tetikleyici, belirli zaman noktalarını hariç tutmak veya dahil etmek için birden çok Takvimle ilişkilendirilebilir. Diyelim ki, görevi her Pazartesi sabahı 10: 00'da yürütülecek şekilde planlıyoruz, ancak yasal bir tatille karşılaşırsa, görev yerine getirilmeyecek. Şu anda, Tetikleyici tetik mekanizmasına dayalı sabit nokta hariç tutma için Takvim'i kullanmamız gerekiyor.
Zamanlayıcı: Bağımsız bir çalışan Quartz konteynerini temsil eder. Trigger ve JobDetail Scheduler'da kaydedilebilir. Her ikisi de kendi gruplarına ve Scheduler'da adına sahiptir. Grup ve ad, Scheduler'ın konteynerde bir nesneyi bulması ve bulması için temel oluşturur. Tetikleyici grubu ve İsim benzersiz olmalı ve JobDetail grubu ve adı da benzersiz olmalıdır (ancak farklı türden olduklarından Tetikleyicinin grubu ve adı ile aynı olabilir). Zamanlayıcı, gruplar ve adlar aracılığıyla kapsayıcıdaki Trigger ve JobDetail'in harici erişimine ve kontrolüne izin veren çoklu arabirim yöntemlerini tanımlar.
1. Yeni bir proje oluşturun ve ilgili pom.xml dosyası aşağıdaki gibidir
< proje xmlns = " xmlns: xsi = "
xsi: schemaLocation = " >
< modelVersion > 4.0.0 < / modelVersion >
< Grup kimliği > bahar bulutu < /Grup kimliği >
< artifactId > sc-programlanmış < / artifactId >
< versiyon > 0.0.1-SNAPSHOT < / version >
< ambalaj > kavanoz < / paketleme >
< isim > sc-programlanmış < / isim >
< url > < / url >
< ebeveyn >
< Grup kimliği > org.springframework.boot < /Grup kimliği >
< artifactId > Spring-boot-starter-ebeveyn < / artifactId >
< versiyon > 2.0.4. YAYIN < / version >
< / ebeveyn >
< bağımlılık yönetimi >
< bağımlılıklar >
< bağımlılık >
< Grup kimliği > org.springframework.cloud < /Grup kimliği >
< artifactId > bahar-bulutu bağımlılıkları < / artifactId >
< versiyon > Finchley. < / version >
< tip > pom < / tür >
< dürbün > ithalat < /dürbün >
< /bağımlılık >
< / bağımlılıklar >
< / dependencyManagement >
< özellikleri >
< project.build.sourceEncoding > UTF-8 < /project.build.sourceEncoding >
< maven.compiler.source > 1.8 < /maven.compiler.source >
< maven.compiler.target > 1.8 < /maven.compiler.target >
< /özellikleri >
< bağımlılıklar >
< bağımlılık >
< Grup kimliği > org.springframework.boot < /Grup kimliği >
< artifactId > yaylı başlangıç < / artifactId >
< /bağımlılık >
< bağımlılık >
< Grup kimliği > org.springframework.boot < /Grup kimliği >
< artifactId > Spring-boot-starter-web < / artifactId >
< /bağımlılık >
< ! - Entegre kuvars tanıtılmalıdır - >
< ! - kuvarsla ilgili bağımlılıklar - >
< ! - < bağımlılık >
< Grup kimliği > org.quartz-scheduler < /Grup kimliği >
< artifactId > kuvars < / artifactId >
< /bağımlılık >
< bağımlılık >
< Grup kimliği > org.quartz-scheduler < /Grup kimliği >
< artifactId > kuvars işleri < / artifactId >
< /bağımlılık > - >
< bağımlılık >
< Grup kimliği > org.springframework.boot < /Grup kimliği >
< artifactId > Spring-boot-starter-kuvars < / artifactId >
< /bağımlılık >
< / bağımlılıklar >
< / proje >
2. Yeni bir sprinboot başlangıç sınıfı ScheduledApplication.java oluşturun
paket sc.schedule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling // Baharın kendi zamanlama görevini aç
publicclass ScheduledApplication {
public static void main (String args) {
SpringApplication.run (ScheduledApplication.class, args);
}
}
3. Bahar zamanlama görev sınıfı
packagec.schedule.spring;
java.text.SimpleDateFormat'ı içe aktar;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Bileşen
public class SpringScheduled {
// her 1 dakikada bir çalıştır
@ Planlanmış (cron = "0 * / 1 * ** *")
public void reportCurrentByCron () {
System.out.println ("Bahar Zamanlama Görevleri:" + dateFormat (). Format (yeni Tarih ()));
}
özel SimpleDateFormat dateFormat () {
returnnewSimpleDateFormat ("HH: mm: ss");
}
}
4. Kuvars zamanlama görev sınıfı
Tek görev modu:
paket sc.schedule.quartz;
import org.quartz.JobDetail;
ithalat org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
org.springframework.context.annotation.Configuration dosyasını içe aktarın;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
importorg.springframework.scheduling.quartz.SchedulerFactoryBean;
@Yapılandırma
publicclass QuartzScheduledOne {
@Fasulye
public ScheduledJobOne getScheduledJobOne () {
yeni ScheduledJobOne () döndürür;
}
/ **
* Sevk fabrikası
*
* @ param jobTrigger
* Tetikleyici
*@dönüş
* /
@Bean (isim = "zamanlayıcı")
public SchedulerFactoryBean schedulerFactory (Trigger jobTrigger) {
SchedulerFactoryBeanfactoryBean = new SchedulerFactoryBean ();
// Kuvars kümesinde kullanılan QuartzScheduler, başladığında mevcut işi günceller
factoryBean.setOverwriteExistingJobs (true);
// Uygulama başladıktan 1 saniye sonra gecikmeli başlatma
factoryBean.setStartupDelay (1);
// Tetikleyiciyi kaydet
factoryBean.setTriggers (jobTrigger);
fabrika dönüşüBean;
}
/ **
*
* Zamanlama tetikleyicisi
*
* @ param reptilianJob
* Misyon
*
*@dönüş
*
* /
@Bean (isim = "jobTrigger")
public CronTriggerFactory BeancronJobTrigger (JobDetail jobDetail) {
CronTriggerFactoryBean tigger = newCronTriggerFactoryBean ();
tigger.setJobDetail (jobDetail);
// cron ifadesi, her 1 dakikada bir çalıştırılır
tigger.setCronExpression ("0/20 ** * *?");
tigger.setName ("jobTrigger");
dönüş kaplanı;
}
/ **
* Yapılandırma görevi
*
* @ param quartzTask
* QuartzTask, yürütülmesi gereken görevdir
*@dönüş
* /
@Bean (isim = "jobDetail")
public MethodInvokingJobDetailFactory BeandetailFactoryBean (ScheduledJobOne quartzTask) {
MethodInvokingJobDetailFactoryBeanjobDetail = new MethodInvokingJobDetailFactoryBean ();
// Eşzamanlı olarak çalıştırılıp çalıştırılmayacağı
jobDetail.setConcurrent (false);
// Görevin adını belirleyin
jobDetail.setName ("jobDetail");
// Çoklu görevde kullanılan görev gruplamasını ayarlayın
jobDetail.setGroup ("jobDetailGroup");
// Yürütülecek nesne
jobDetail.setTargetObject (quartzTask);
/ *
* TODO, QuartzTask sınıfında yürütülecek yöntemleri yürütmek için çok önemlidir
* /
jobDetail.setTargetMethod ("execute");
return jobDetail;
}
}
Görev modu referans kaynak kodu
5. İlgili sınıf yapısının açıklaması
6. ScheduledApplication sınıfını başlatın ve zamanlanan görevin başlatılıp başlatılmadığını doğrulayın
(1) QuartzScheduled sınıfının Yapılandırma açıklamasına açıklama ekleyin
Günlüğü görüntülemek için ScheduledApplication sınıfını başlatın:
(2) QuartzScheduled sınıfının Yapılandırma açıklamasını serbest bırakın ve ardından QuartzScheduled sınıfının Yapılandırma açıklamasına açıklama ekleyin
Günlüğü görüntülemek için ScheduledApplication sınıfını başlatın:
Makaleyi iletmeyi unutmayın ~