Quartz
是一個定時任務的調度框架,涉及到的主要概念有如下幾個:java
Scheduler
:調度器,全部的調度都由它控制,全部的任務都由它管理。mysql
Job
:任務,定義業務邏輯。git
JobDetail
:基於Job,進一步封裝。其中關聯一個Job,併爲Job指定更詳細的信息。github
Trigger
:觸發器,能夠指定給某個任務,指定任務的觸發機制。redis
一 建立簡單任務
1.1 Quartz依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
1.2 建立任務
任務建立須要實現Job
接口,重寫execute(JobExecutionContext jobExecutionContext)
方法,增長定時任務的業務邏輯,這裏我只是簡單的打印一下定時任務執行。spring
@Slf4j public class SimpleJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { log.info("job execute---"+new Date()); } }
1.3 JobDetail增長屬性
這裏增長的屬性能夠在Job實現類中獲取,來處理業務。sql
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class) // 任務標識,及任務分組 .withIdentity("job1", "group1") // 連接調用,增長鬚要的參數 .usingJobData("name","Java旅途") .usingJobData("age",18) .build();
1.4 Trigger實現
Trigger分爲兩種,SimpleTrigger
和CronTrigger
。SimpleTrigger
是根據Quartz的一些api實現的簡單觸發行爲。CronTrigger
用的比較多,使用cron
表達式進行觸發。這裏先用SimpleTrigger
來實現。數據庫
SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") // 當即執行 .startNow() // 10s後中止 .endAt(new Date(System.currentTimeMillis()+10*1000)) .withSchedule( SimpleScheduleBuilder.simpleSchedule() // 每秒執行一次 .withIntervalInSeconds(1) // 一直執行 .repeatForever() ).build();
1.5 啓動任務
@Autowired private Scheduler scheduler; scheduler.scheduleJob(jobDetail,simpleTrigger);
1.6 執行效果
啓動項目後,任務當即執行,每秒執行一次,10s後中止,執行效果圖以下:api
二 動態操做定時任務
有時候除了已經開發好的定時任務外,還須要咱們手動去建立任務而且控制任務的執行。緩存
2.1 建立任務
@GetMapping("create") public void createJob(String jobName,String jobGroup,String cron,String triggerName,String triggerGroup) throws SchedulerException { JobKey jobKey = new JobKey(jobName,jobGroup); // 若是存在這個任務,則刪除 if(scheduler.checkExists(jobKey)) { scheduler.deleteJob(jobKey); } JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class) .withIdentity(jobKey) .build(); CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron); Trigger trigger = TriggerBuilder.newTrigger() .withIdentity(triggerName,triggerGroup) .withSchedule(cronScheduleBuilder).build(); scheduler.scheduleJob(jobDetail,trigger); }
2.2 暫停任務
@GetMapping("pause") public void pauseJob(String jobName,String jobGroup) throws SchedulerException { JobKey jobKey = JobKey.jobKey(jobName, jobGroup); JobDetail jobDetail = scheduler.getJobDetail(jobKey); if (jobDetail == null) { return; } scheduler.pauseJob(jobKey); }
2.3 恢復暫停的任務
@GetMapping("remuse") public void remuseJob(String jobName, String jobGroup) throws SchedulerException { JobKey jobKey = JobKey.jobKey(jobName, jobGroup); JobDetail jobDetail = scheduler.getJobDetail(jobKey); if (jobDetail == null) { return; } scheduler.resumeJob(jobKey); }
2.4 刪除定時任務
@GetMapping("remove") public void removeJob(String jobName, String jobGroup,String triggerName,String triggerGroup) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); Trigger trigger = scheduler.getTrigger(triggerKey); if (trigger == null) { return; } // 中止觸發器 scheduler.pauseTrigger(triggerKey); // 移除觸發器 scheduler.unscheduleJob(triggerKey); // 刪除任務 scheduler.deleteJob(jobKey); }
三 任務持久化
Quartz默認使用RAMJobStore
存儲方式將任務存儲在內存中,除了這種方式還支持使用JDBC將任務存儲在數據庫,爲了防止任務丟失,咱們通常會將任務存儲在數據庫中。
這裏使用mysql進行存儲,在quartz的源碼包中找到文件tables_mysql_innodb.sql
,而後在客戶端進行運行sql文件。若是嫌源碼包很差下載的話,我已經將sql文件上傳至GitHub了,能夠直接訪問github拉去表結構,數據表以下:
3.1 增長mysql和jdbc依賴
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
3.2 指定使用jdbc存儲
quartz默認使用memory存儲,這裏修改爲jdbc進行存儲,並配置jdbc的相關信息
spring: quartz: job-store-type: jdbc datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/simple_fast username: root password: root
3.3 建立任務
啓動項目,調用create
接口建立任務,而後數據表中就會新增任務相關的數據了。
本文示例代碼已上傳至github,點個star
支持一下!
Spring Boot系列教程目錄
spring-boot-route(一)Controller接收參數的幾種方式
spring-boot-route(二)讀取配置文件的幾種方式
spring-boot-route(五)整合Swagger生成接口文檔
spring-boot-route(六)整合JApiDocs生成接口文檔
spring-boot-route(七)整合jdbcTemplate操做數據庫
spring-boot-route(八)整合mybatis操做數據庫
spring-boot-route(九)整合JPA操做數據庫
spring-boot-route(十一)數據庫配置信息加密
spring-boot-route(十二)整合redis作爲緩存
spring-boot-route(十三)整合RabbitMQ
spring-boot-route(十五)整合RocketMQ
spring-boot-route(十六)使用logback生產日誌文件
spring-boot-route(十七)使用aop記錄操做日誌
spring-boot-route(十八)spring-boot-adtuator監控應用
spring-boot-route(十九)spring-boot-admin監控服務
spring-boot-route(二十)Spring Task實現簡單定時任務
spring-boot-route(二十一)quartz實現動態定時任務
spring-boot-route(二十二)實現郵件發送功能
這個系列的文章都是工做中頻繁用到的知識,學完這個系列,應付平常開發綽綽有餘。若是還想了解其餘內容,掃面下方二維碼告訴我,我會進一步完善這個系列的文章!