SpringBoot整合Quartz方法詳解
為了方便你的學習
代碼地址:Chengyunlai/Quartz_learn: SpringBoot + Quartz定時任務 (github.com)
基礎依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
<version>2.5.2</version>
</dependency>Quartz是單應用工程中用的比較多的定時任務框架。該定時任務主要可以分為:
- 在內(nèi)存中的任務:一般定義在工程內(nèi)部存儲,如果工程重啟后,若該任務非自動執(zhí)行的,則不會再開啟。
- 可持久化的任務:將任務的特性存儲在數(shù)據(jù)庫中,工程重啟后可以重新讀取原先正在執(zhí)行的任務,繼續(xù)執(zhí)行。
cron表達式
corn是用來控制任務觸發(fā)的時刻。
我列舉一些常用的:
- 每秒鐘觸發(fā)
"* * * * * *":
- 每隔5秒執(zhí)行一次
*/5 * * * * ?
- 每分鐘觸發(fā)
"0 * * * * ?"
- 每一小時觸發(fā)
"0 * * * * ?"
- 每天10點觸發(fā)一次
"0 0 10 * * ?"
- 每天0點觸發(fā)一次
"0 0 0 * * ?"
通用
需要在啟動類上加上@EnableScheduling注解。
內(nèi)存任務
工程啟動時就在執(zhí)行的任務
直接定義一個執(zhí)行任務,例如:
每秒都輸出測試
@Service
public class ScheduleTest {
@Scheduled(cron = "0/1 * * * * *")
public void test() {
System.out.println("測試");
}
}啟動類:
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}啟動后看控制臺中就會輸出相應的內(nèi)容。
手動控制某個任務
這里需要我們自己定義任務。
定義任務
通過實現(xiàn)Job接口,即可定義一個任務,并且我們可以手動去控制這個任務的開啟。
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context) {
System.out.println("自定義任務");
}
}借助Web-Controller去開啟該任務
導入依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.6.RELEASE</version>
</dependency>編寫Controller,這是一個固定的寫法。
- 指定任務:
JobBuilder.newJob(任務.class) .withIdentity(任務名, 任務組).build(); - 指定cron表達式,創(chuàng)建Trigger:
CronScheduleBuilder.cronSchedule(cron表達式);TriggerBuilder.newTrigger().withIdentity(啟動器的名字, 啟動器的分組) .withSchedule(cron).build();
- 調(diào)用任務:
scheduler.scheduleJob(任務類型對象, 啟動器對象)
/**
* @ClassName
* @Description
* @Author:chengyunlai
* @Date
* @Version 1.0
**/
@RestController
public class DynamicScheduleController {
@Autowired
private Scheduler scheduler;
@GetMapping("/addSchedule")
public String addSchedule() throws SchedulerException {
int random = ThreadLocalRandom.current().nextInt(1000);
// 1. 創(chuàng)建JobDetail,指定定時任務實現(xiàn)類的類型
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
.withIdentity("test-schedule" + random, "test-group").build();
// 2. 創(chuàng)建Trigger,并指定每3秒執(zhí)行一次
CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0/3 * * * * ?");
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("test-trigger" + random, "test-trigger-group")
.withSchedule(cron).build();
// 3. 調(diào)度任務
scheduler.scheduleJob(jobDetail, trigger);
return "success";
}通過瀏覽器輸入項目的地址,一般默認是localhost:8080/addSchedule,輸入后即可看到控制臺輸出了任務執(zhí)行的輸出內(nèi)容。
持久化
如果工程重啟了,上面的SimpleJob這個定時任務并不會重新啟動。解決的辦法就是將任務持久化,Quartz提供了解決方案,SpringBoot簡化了這個操作。我們只需要配置好:數(shù)據(jù)庫、數(shù)據(jù)源、操作數(shù)據(jù)庫的JDBC即可。
依賴:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>- 使用mysql數(shù)據(jù)庫:導入它的驅動,mysql-connector-java。
- 使用Druid作為我們的數(shù)據(jù)源:druid。
- 使用spring-jdbc,幫助我們自動將任務信息存入到數(shù)據(jù)庫中。
配置
# 設置將定時任務的信息保存到數(shù)據(jù)庫 spring.quartz.job-store-type=jdbc # 每次應用啟動的時候都初始化數(shù)據(jù)庫表結構 # 如果 spring.quartz.jdbc.initialize-schema 設置為 always 的話有個問題:每次重啟應用的時候,跟 Quartz 相關的表會被刪除重建! # 所以為了避免表被重復創(chuàng)建,我們可以提前創(chuàng)建表,然后將其指定為never spring.quartz.jdbc.initialize-schema=never # 數(shù)據(jù)庫配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/scheduled?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=root
Quartz為我們準備了sql數(shù)據(jù)表
官網(wǎng):Downloads (quartz-scheduler.org)
以我:quartz-2.3.0-SNAPSHOT為例子:
下載源碼后,找到jdbcjobstore這個目錄:
quartz-2.3.0-SNAPSHOT\src\org\quartz\impl\jdbcjobstore
然后會有一系列的sql文件,找到和你數(shù)據(jù)庫匹配的那個sql文件即可,我用的是mysql。

執(zhí)行SQL文件建表,我的數(shù)據(jù)庫名是:scheduled,各位從我的url中應該也能看出來。
建表完成后,所有配置工作結束了,啟動程序,重新在瀏覽器中輸入:localhost:8080/addSchedule,然后刷新一下數(shù)據(jù)庫,就會發(fā)現(xiàn)任務被持久化了,此時重啟工程后,該任務依舊會自動執(zhí)行。
暫停任務和刪除任務
我們在手動開啟該任務的時候會指定:
- 任務的名稱和組
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class) .withIdentity(任務名,任務組).build();
在暫停和恢復任務時,就需要用JobKey.jobKey(任務名,任務組),得到一個JobKey,然后使用scheduler.pauseJob(jobkey)即可暫停任務;scheduler.resumeJob(jobKey)恢復任務。
- 刪除任務的時候需要將任務和Trigger都刪除,而在上面我們可以拿到這個
jobkey表示任務,我們也需要拿到trigger,同樣的我們也定義過啟動器的名字和分組。
`TriggerBuilder.newTrigger().withIdentity(啟動器的名字, 啟動器的分組) .withSchedule(cron).build();`
TriggerKey.triggerKey((啟動器的名字, 啟動器的分組);也可以拿到trigger表示啟動器。
- 通過以下順序完整刪除任務
- // 停止觸發(fā)器
- scheduler.pauseTrigger(triggerKey);
- // 移除觸發(fā)器
- scheduler.unscheduleJob(triggerKey);
- // 刪除任務
- scheduler.deleteJob(jobKey);
- // 停止觸發(fā)器
// 暫停
@GetMapping("/pauseSchedule")
public String pauseSchedule(String jobName, String jobGroup) throws SchedulerException {
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
// 獲取定時任務
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if (jobDetail == null) {
return "error";
}
scheduler.pauseJob(jobKey);
return "success";
}
// 恢復
@GetMapping("/remuseSchedule")
public String remuseSchedule(String jobName, String jobGroup) throws SchedulerException {
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
// 獲取定時任務
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if (jobDetail == null) {
return "error";
}
scheduler.resumeJob(jobKey);
return "success";
}
// 刪除定時任務
@GetMapping("/removeSchedule")
public String removeSchedule(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 "error";
}
// 停止觸發(fā)器
scheduler.pauseTrigger(triggerKey);
// 移除觸發(fā)器
scheduler.unscheduleJob(triggerKey);
// 刪除任務
scheduler.deleteJob(jobKey);
return "success";
}未來
后續(xù),我準備結合前端,做一個頁面的定時任務功能。
到此這篇關于SpringBoot整合Quartz方法詳解的文章就介紹到這了,更多相關SpringBoot整合Quartz內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java實現(xiàn)json數(shù)據(jù)處理的常用腳本分享
這篇文章主要為大家詳細介紹了Java實現(xiàn)json數(shù)據(jù)處理的常用腳本,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以學習一下2023-03-03
一文搞懂MyBatis多數(shù)據(jù)源Starter實現(xiàn)
本文將實現(xiàn)一個MyBatis的Springboot的Starter包,引用這個Starter包后,僅需要提供少量配置信息,就能夠完成MyBatis多數(shù)據(jù)源的初始化和使用,需要的小伙伴可以參考一下2023-04-04
SpringBoot整合MyCat實現(xiàn)讀寫分離的方法
這篇文章主要介紹了SpringBoot整合MyCat實現(xiàn)讀寫分離的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04

