1. 程式人生 > >spring-boot-route(二十一)quartz實現動態定時任務

spring-boot-route(二十一)quartz實現動態定時任務

`Quartz`是一個定時任務的排程框架,涉及到的主要概念有以下幾個: `Scheduler`:排程器,所有的排程都由它控制,所有的任務都由它管理。 `Job`:任務,定義業務邏輯。 `JobDetail`:基於Job,進一步封裝。其中關聯一個Job,併為Job指定更詳細的資訊。 `Trigger`:觸發器,可以指定給某個任務,指定任務的觸發機制。 ## 一 建立簡單任務 ### 1.1 Quartz依賴 ```java ``` ### 1.2 建立任務 任務建立需要實現`Job`介面,重寫`execute(JobExecutionContext jobExecutionContext)`方法,增加定時任務的業務邏輯,這裡我只是簡單的列印一下定時任務執行。 ```java @Slf4j public class SimpleJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { log.info("job execute---"+new Date()); } } ``` ### 1.3 JobDetail增加屬性 這裡增加的屬性可以在Job實現類中獲取,來處理業務。 ```java 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`來實現。 ```java 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 啟動任務 ```java @Autowired private Scheduler scheduler; scheduler.scheduleJob(jobDetail,simpleTrigger); ``` ### 1.6 執行效果 啟動專案後,任務立即執行,每秒執行一次,10s後停止,執行效果圖如下: ![](https://img2020.cnblogs.com/blog/1719198/202010/1719198-20201021094946852-1362946720.png) ## 二 動態操作定時任務 有時候除了已經開發好的定時任務外,還需要我們手動去建立任務並且控制任務的執行。 ### 2.1 建立任務 ```java @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 暫停任務 ```java @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 恢復暫停的任務 ```java @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 刪除定時任務 ```java @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拉去表結構,資料表如下: ![](https://img2020.cnblogs.com/blog/1719198/202010/1719198-20201021095021469-1453046381.png) ### 3.1 增加mysql和jdbc依賴 ```xml ``` ### 3.2 指定使用jdbc儲存 quartz預設使用memory儲存,這裡修改成jdbc進行儲存,並配置jdbc的相關資訊 ```java 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`介面建立任務,然後資料表中就會新增任務相關的資料了。 ![](https://img2020.cnblogs.com/blog/1719198/202010/1719198-20201021095038430-932745024.png) 此是spring-boot-route系列的第二十一篇文章,這個系列的文章都比較簡單,主要目的就是為了幫助初次接觸Spring Boot 的同學有一個系統的認識。本文已收錄至我的[github](https://github.com/binzh303/spring-boot-route),歡迎各位小夥伴`star`! **github**:https://github.com/binzh303/spring-boot-route ## 點關注、不迷路 如果覺得文章不錯,歡迎**關注**、**點贊**、**收藏**,你們的支援是我創作的動力,感謝大家。 如果文章寫的有問題,請不要吝惜文筆,歡迎留言指出,我會及時核查修改。 如果你還想更加深入的瞭解我,可以微信搜尋「**Java旅途**」進行關注。回覆「**1024**」即可獲得學習視訊及精美電子書。每天7:30準時推送技術文章,讓你的上班路不在孤獨,而且每月還有送書活動,助你提升硬