Quartz是开源组织OpenSymphony的一个作业调度框架,采用多线程架构,可伸缩性强,可集群扩展。Spring集成Quartz简单高效,只需实现Job接口,在方法execute()中添加业务逻辑。
本文分享Spring集成和配置Quartz的方法,并封装一个REST接口,演示项目中的实际应用。
代码文件 |
功能要点 |
|
SpringBoot集成Quartz |
pom.xml |
引入Quartz依赖:spring-boot-starter-quartz |
application.yml |
配置Quartz属性,配置Job运行时间cron表达式 |
|
QuartzConfig.java |
配置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接口调用定时任务创建示例
来源:CSDN
作者:dingxl18
链接:https://blog.csdn.net/xiziyidi/article/details/104106381