Quartz框架
任务(Job):需要执行的具体工作
触发器(Trigger):在特定的时间触发任务的执行
调度器(Scheduler):任务的实际执行者,负责粘合任务和触发器。
案例:
新建maven项目,添加Quartz依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.6</version>
</dependency>
新增任务明细类
package cn.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class RemindJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("任务正在执行!");
}
}
测试类与cron表达式相关介绍,注意,触发器有两种创建方式,SimpleTrigger 与 CronTrigger
package cn.quartz;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
public class TestMain {
public static void main(String[] args) throws Exception {
//创建任务
JobDetail jobDetail = new JobDetail("myJob","A",RemindJob.class);
//创建触发器,指定固定时间间隔触发器:SimpleTrigger,通过设置触发器的属性:开始时间、结束时间、重复次数、重复间隔等
//轮询模式,每三秒执行一次
SimpleTrigger simpleTrigger =
new SimpleTrigger("mySimpleTrigger",SimpleTrigger.REPEAT_INDEFINITELY,3000);
//设置开始时间位当前时间的下一秒
simpleTrigger.setStartTime(new Date(System.currentTimeMillis()+1000));
//指定时间点的触发器(比如每天凌晨3点执行一次):CronTrigger,实际开发中常用
//第三个参数,cron表达式,按位置分别表示为
//秒 分 时 月份中的哪一天 月 星期几 年
//按空格分隔,其中(月份中的哪一天)与(星期几)表示任意值时可用 ‘?’或‘*’ 号,其他字段表示任意值用‘*’号
//除了可以设置某个固定值,还可以设置一个范围(-)、一个列表(逗号间隔)、递增(初始值/增量)如:
//"* 25-30 1 * * ?" :表示凌晨1点25分到30分的范围执行
//"* 20,30,40 1 * * ?" :表示凌晨1点20分,30分,40分执行
//"* 10/5 1 * * ?" :表示凌晨1点10分开始,每5分钟执行一次
//注意:(月份中的哪一天)与(星期几)字段不能同时使用‘?’,也不能同时使用'*'号,年字段可以省略(至少保证表达式中存在6个字段)
//表示12时57分40秒执行
CronTrigger cronTrigger = new CronTrigger(",myCronTrigger", "B", "40 57 12 ? * *");
//创建调度器
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
//调度器绑定任务与触发器
//scheduler.scheduleJob(jobDetail, simpleTrigger);
scheduler.scheduleJob(jobDetail,cronTrigger);
//调度器执行任务
scheduler.start();
//模拟主线程睡20秒后触发调度器停止
Thread.sleep(20000);
//调度器停止任务
scheduler.shutdown();
}
}
在与Spring整合的项目中,可在Controller层在任务方法上直接使用
@Scheduled(cron="0 0/10 * * * ?") 注解,就会定时执行该任务方法。
spring配置文件中需引入spring-task.xsd文件
在类中使用@Scheduled注解时,需要spring能扫到该类。