Quartz是開源組織OpenSymphony的一個做業調度框架,採用多線程架構,可伸縮性強,可集羣擴展。Spring集成Quartz簡單高效,只需實現Job接口,在方法execute()中添加業務邏輯。
java
本文分享Spring集成和配置Quartz的方法,並封裝一個REST接口,演示項目中的實際應用。git
代碼文件github |
功能要點spring |
|
SpringBoot集成Quartz數據庫 |
pom.xml多線程 |
引入Quartz依賴:spring-boot-starter-quartz架構 |
application.ymlapp |
配置Quartz屬性,配置Job運行時間cron表達式框架 |
|
QuartzConfig.javaide |
配置Bean: JobDetail, Trigger,讀取cron運行時間配置 |
|
實現定時任務 |
QuartzJob.java |
實現Job接口,或者繼承QuartzJobBean類 |
功能調用 |
CheckController.java |
增長REST接口/chk/job,建立一個Job定時任務,Scheduler上下文Context傳遞數據。 |
l 代碼
Github下載:https://github.com/jextop/StarterApi/
Quartz示例:https://github.com/rickding/HelloJava/tree/master/HelloQuartz
l SpringBoot集成Quartz
1. 新建SpringBoot項目時,選中Quartz,將自動添加Quartz依賴。
2. 已有SpringBoot項目,能夠在pom.xml中直接添加Quartz依賴。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
3. 在application.yml中配置Quartz,指定任務存儲類型:
memory:內存方式,默認。
jdbc:數據庫方式,將建立數據表並保存任務信息。
spring:
quartz:
job-store-type: jdbc
jdbc:
initialize-schema: always
job:
quartz:
cron: 0 0/23 * * * ?
4. 在QuartzConfig.java中配置Bean,聲明JobDetail和Trigger,使用cron表達式設置任務運行時間:
@Configuration
@ConfigurationProperties("job.quartz")
public class QuartzConfig {
private String cron;
@Bean
public JobDetail quartzJob() {
return JobBuilder.newJob(QuartzJob.class).storeDurably().build()
}
@Bean
public Trigger quartzTrigger() {
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
return TriggerBuilder.newTrigger()
.forJob(quartzJob())
.withSchedule(scheduleBuilder)
.build();
}
public String getCron() {
return cron;
}
public void setCron(String cron) {
this.cron = cron;
}
}
l 定時任務QuartzJob.java,實現Job接口,或者繼承QuartzJobBean類。
從JobExecutionContext中讀取附加信息,執行業務邏輯。
public class QuartzJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
LogUtil.info("quartz job ", new Date());
try {
JextService jextService = (JextService) context.getScheduler().getContext().get("jextService");
if (jextService != null) {
jextService.getInfo(true);
}
} catch (SchedulerException e) {
LogUtil.info(e.getMessage());
}
}
}
l 功能調用
1. 增長RestController:CheckController.java
2. 增長REST接口/chk/job,建立一個定時任務,添加附加信息到Scheduler上下文中。
@GetMapping(value = "/chk/job")
public Object job() {
JobDetail job = JobBuilder.newJob(QuartzJob.class).build();
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
.forJob(job)
.startAt(new Date())
.build();
Date date = null;
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.getContext().put("jextService", jextService);
date = scheduler.scheduleJob(job, trigger);
scheduler.startDelayed(1);
} catch (SchedulerException e) {
e.printStackTrace();
}
final Date jobDate = date;
return new HashMap<String, Object>() {{
put("chk", "job");
put("date", jobDate);
}};
}
l REST接口調用定時任務建立示例