<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> <version>2.5.2</version> </dependency>
Quartz是單一應用工程中用的比較多的定時任務框架。此定時任務主要可分為:
在記憶體中的任務:一般定義在工程內部存儲,如果工程重啟後,若該任務非自動執行的,則不會再開啟。
可持久化的任務:將任務的特性儲存在資料庫中,工程重新啟動後可以重新讀取原先正在執行的任務,繼續執行。
corn
是用來控制任務觸發的時刻。
我列舉一些常用的:
每秒鐘觸發
"* * * * * *":
每隔5秒執行一次
*/5 * * * * ?
每分鐘觸發
"0 * * * * ?"
"0 * * * * ?"
"0 0 10 * * ?"
"0 0 0 * * ?"通用需要在啟動類別上加上
@EnableScheduling註解。
測試
@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); } }啟動後看控制台中就會輸出對應的內容。 手動控制某個任務這裡需要我們自己定義任務。 定義任務透過實作
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();
#CronScheduleBuilder.cronSchedule(cron表達式);
#TriggerBuilder.newTrigger().withIdentity(啟動器的名字, 啟動器的分組) .withSchedule(cron).build();
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. 创建JobDetail,指定定时任务实现类的类型 JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class) .withIdentity("test-schedule" + random, "test-group").build(); // 2. 创建Trigger,并指定每3秒执行一次 CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0/3 * * * * ?"); Trigger trigger = TriggerBuilder.newTrigger().withIdentity("test-trigger" + random, "test-trigger-group") .withSchedule(cron).build(); // 3. 调度任务 scheduler.scheduleJob(jobDetail, trigger); return "success"; }透過瀏覽器輸入項目的位址,一般預設為
localhost:8080/addSchedule,輸入後即可看到控制台輸出了任務執行的輸出內容。
SimpleJob這個定時任務並不會重新啟動。解決的辦法就是將任務持久化,
Quartz提供了解決方案,SpringBoot簡化了這個操作。我們只需要配置好:資料庫、資料來源、操作資料庫的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>
# 设置将定时任务的信息保存到数据库 spring.quartz.job-store-type=jdbc # 每次应用启动的时候都初始化数据库表结构 # 如果 spring.quartz.jdbc.initialize-schema 设置为 always 的话有个问题:每次重启应用的时候,跟 Quartz 相关的表会被删除重建! # 所以为了避免表被重复创建,我们可以提前创建表,然后将其指定为never spring.quartz.jdbc.initialize-schema=never # 数据库配置 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
jdbcjobstore這個目錄:
quartz-2.3.0-SNAPSHOT \src\org\quartz\impl\jdbcjobstore
sql文件,找到和你資料庫匹配的那個sql文件即可,我用的是mysql 。
scheduled,各位從我的url應該也能看出來。
localhost:8080/addSchedule,然後刷新一下資料庫,就會發現任務被持久化了,此時重啟工程後,該任務依舊會自動執行。
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class) .withIdentity(任务名,任务组).build();在暫停和復原任務時,就需要用
JobKey.jobKey(任務名,任務群組),得到一個
JobKey,然後使用
scheduler.pauseJob(jobkey)即可暫停任務;
scheduler.resumeJob(jobKey)恢復任務。
jobkey表示任務,我們也需要拿到trigger,同樣的我們也定義過啟動器的名字和分組。
`TriggerBuilder.newTrigger().withIdentity(启动器的名字, 启动器的分组) .withSchedule(cron).build();`
TriggerKey.triggerKey((啟動器的名字, 啟動器的分組);也可以拿到
trigger表示啟動器。
通过以下顺序完整删除任务
scheduler.deleteJob(jobKey);
scheduler.unscheduleJob(triggerKey);
scheduler.pauseTrigger(triggerKey);
// 停止触发器
// 移除触发器
// 删除任务
// 暂停 @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"; } // 停止触发器 scheduler.pauseTrigger(triggerKey); // 移除触发器 scheduler.unscheduleJob(triggerKey); // 删除任务 scheduler.deleteJob(jobKey); return "success"; }
以上是SpringBoot怎麼整合Quartz的詳細內容。更多資訊請關注PHP中文網其他相關文章!