一、介绍
quartz是功能强大、轻量级的定时任务框架
核心类说明:
Scheduler:任务调度器。所有的任务调度都由其控制,是Quartz的核心
Job:任务。需要定时执行的程序
JobDetail:基于Job,对Job进一步包装,为Job指定更详细的属性,如标识等
Trigger:触发器。规定任务的一套触发规则,如什么时候执行,什么时候结束等
二、简单入门案例
2.1、引入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId
</dependency>
</dependencies>
2.2、编写Job任务
//Job任务
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//获取JobDetail上的标识
JobDetail jobDetail = context.getJobDetail();
JobKey jobKey = jobDetail.getKey();
Object group = jobKey.getGroup();
Object name = jobKey.getName();
System.out.println(name);
System.out.println(group);
System.out.println("MyJob execute " + LocalDateTime.now().getSecond());
}
}
2.3、调度Job
public class MyQuartz {
public static void main(String[] args) throws SchedulerException {
//定义调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//定义触发器
Trigger trigger = getSimpleTrigger();
//JobDetail
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
//给JobDetail加上标识
.withIdentity("job", "jobGroup")
.usingJobData("jobData","jobData")
.build();
//将JobDetail和触发器增加到调度器中
scheduler.scheduleJob(jobDetail,trigger);
//启动调度器
scheduler.start();
}
//cron表达式触发器
private static Trigger getCronTrigger(){
return TriggerBuilder.newTrigger()
//触发器名字与组
.withIdentity("MyTriggerName", "myTriggerGroup")
//每天12点执行
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 * * ?"))
.build();
}
//简单触发器
private static Trigger getSimpleTrigger(){
return TriggerBuilder.newTrigger()
//触发器名字与组
.withIdentity("MyTriggerName", "myTriggerGroup")
//开始时间为现在
.startNow()
//在结束时间内,每5秒执行一次
// .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever())
//在结束时间内,每5秒执行一次,共计执行5次(启动时执行的那一次不算在里面)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).withRepeatCount(5))
//结束时间是2023年6月1日
.endAt(new GregorianCalendar(2023, 5, 1, 0, 0, 0).getTime())
.build();
}
}