配置
pom
Spring Boot 使用的是2.1.6.RELEASE,依賴中增加如下配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
application.properties
排程器可以和springboot公用資料源
#使用資料庫固化排程資訊
spring.quartz.job-store-type=jdbc
#排程器名稱
spring.quartz.scheduler-name=MyScheduler
#不重新建立資料表
spring.quartz.jdbc.initialize-schema=never
#線程數量
spring.quartz.properties.org.quartz.threadPool.threadCount = 50
#持久化實作
spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
#資料庫方言StdJDBCDelegate
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
java代碼
任務:實作Job接口即可
public interface Job {
//context中包含目前任務關聯的資訊
//JobExecutionException 當任務執行失敗時可以通過配置來控制是否繼續執行等操作
void execute(JobExecutionContext context) throws JobExecutionException;
}
排程器:在service中注入Scheduler即可,Scheduler是排程器整體管理包括暫停任務,更新任務,恢複任務等
需求以及解決方法
每個任務使用相同上下文即JobData
繼承Job的java類上增加@PersistJobDataAfterExecution,@DisallowConcurrentExecution注解,通常這兩個注解配合使用
- @PersistJobDataAfterExecution:在任務執行後固化JobData至資料庫
- @DisallowConcurrentExecution:避免同一個組的同一個任務并發執行以免JobData混亂
更新JobData至目前任務
//jobDetail 任務資訊
JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(job.getName(), job.getGroup()));
jobDetail.getJobDataMap().put("aaa", "bbb");
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(TriggerKey.triggerKey(job.getName(), job.getGroup()));
Set<Trigger> triggers = new HashSet<>();
triggers.add(trigger);
//true 就是替換資料庫中JobDataMap
scheduler.scheduleJob(jobDetail,triggers,true);
任務控制
- 暫停任務:scheduler.pauseJob(jobKey)
- 恢複任務:scheduler.resumeJob(jobKey)
- 立即執行任務:scheduler.triggerJob(jobKey)
- 執行中的任務:
List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs()
//擷取具體任務資訊
JobDetail jobDetail = executingJob.getJobDetail();
- 查詢任務
//依據分組查詢,如需其他查找檢視api中實作了org.quartz.Matcher接口的類即可
GroupMatcher<JobKey> matcher = GroupMatcher.groupContains(groupKeyword);
Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
//通過JobKey擷取排程器中具體任務以及相關資訊
scheduler.getJobDetail(jobKey);