spring boot整合quartz實現通過頁面操作管理定時任務
spring boot整合quartz實現通過頁面操作管理定時任務
說起quartz,大家肯定就會想起那些繁雜的配置,複雜的程式碼。但是如果專案中要用到定時任務的話,除了quartz似乎也想不出來別的框架了,畢竟人家做的確實優秀。
但是在spring boot中使用quartz,再也不用像以前那麼大費周章了。spring boot將quartz的實現細節全都給你封裝好了,呼叫定時任務是需要一個小小的註解@Shedule
。
雖然使用起來簡單,但是他卻能實實在在的達到定時呼叫程式碼的作用。不過我們的野心卻不止於此。
定時任務通過我們配置的cron
表示式定期的執行,但是我們看不到這個任務的執行狀態。又比如有些定時任務臨時需要取消,或者只是在大半夜跑那麼一兩次就停止。各種複雜的場景使得純粹的通過cron
在使用之前先了解幾個關鍵詞:
Job
通過實現Job
類,在實現方法中寫我們具體想要定時任務完成的工作,然後交給quartz
管理。
JobDetailJob
只負責實現具體任務,所以還需要藉助JobDetail
來儲存一些描述Job
的基本資訊。
Quartz JobBuilder
為構造JobDetail
實體提供的builder-style API
。你可以這樣使用它來構建一個JobDetail
:
@Bean public JobDetail jobDetail() { return JobBuilder.newJob().ofType(SampleJob.class) .storeDurably() .withIdentity("Qrtz_Job_Detail") .withDescription("Invoke Sample Job service...") .build(); }
Spring JobDetailFactoryBean
在Spring
中配置JobDetail
的方式:
@Bean public JobDetailFactoryBean jobDetail() { JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean(); jobDetailFactory.setJobClass(SampleJob.class); jobDetailFactory.setDescription("Invoke Sample Job service..."); jobDetailFactory.setDurability(true); return jobDetailFactory; }
Trigger
觸發器,代表一個排程引數的配置,什麼時候去排程:
@Bean
public Trigger trigger(JobDetail job) {
return TriggerBuilder.newTrigger().forJob(job)
.withIdentity("Qrtz_Trigger")
.withDescription("Sample trigger")
.withSchedule(simpleSchedule().repeatForever().withIntervalInHours(1))
.build();
}
Scheduler
排程器,通過Job
和Trigger
來註冊一個排程器:
@Bean
public Scheduler scheduler(Trigger trigger, JobDetail job) {
StdSchedulerFactory factory = new StdSchedulerFactory();
factory.initialize(new ClassPathResource("quartz.properties").getInputStream());
Scheduler scheduler = factory.getScheduler();
scheduler.setJobFactory(springBeanJobFactory());
scheduler.scheduleJob(job, trigger);
scheduler.start();
return scheduler;
}
以上是使用quartz需要知道的一些概念,其實總結起來就三個東西:job|jobDetail
、trigger
和schedule
。也就是任務,觸發器和排程器。所以我們只要用程式碼把他們例項化出來就好了。並且還可以將任務持久化到資料庫中,方便我們去各種操作任務。quartz
會在專案啟動時自動開始執行可執行狀態下的定時任務,而且還可以支援叢集。