相关文章链接
BaseCalendar
专门用于屏蔽一个时间区间,使 Trigger 在这个区间中不被触发
AnnualCalendar
排除每一年中指定的一天或多少天,精度是天
CronCalendar
使用表达式排除某些时间段不执行,精度取决于 Cron 表达式,最大精度到秒
DailyCalendar
指定的时间范围内的每一天不执行,指定每天的时间段,格式是 HH: MM [: SS[mmm]],即最大精度可以到毫秒
HolidayCalendar
排除节假日,精度到天
MonthlyCalendar
排除月份中的数天,可选值为 1-31,精度是天
WeeklyCalendar
排除星期中的一天或多天,可选值比如为:java.util.Calendar.SUNDAY,精度是天
基本使用
public class CalendarSchedule {
public static void main(String[] args) throws SchedulerException {
//创建一个 JobDetail 的实例,将该实例与 HelloJob 绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("test")
.build();
AnnualCalendar holidays = new AnnualCalendar();
// 排除今天的时间 2017 年 11 月 27 日(月份是从 0~11 的)
GregorianCalendar nationalDay = new GregorianCalendar(2017, 10, 27);
// 排除的日期,如果为 false 则为包含
holidays.setDayExcluded(nationalDay,true);
Trigger simpleTrigger = TriggerBuilder.newTrigger()
.withIdentity("testTrigger")
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1)
.repeatForever()) //每一秒执行一次 job
.modifiedByCalendar("holidays") //将我们设置好的 Calander 与 trigger 绑定
.build();
//创建 Scheduler 实例
StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = stdSchedulerFactory.getScheduler();
//向 Scheduler 注册日历
scheduler.addCalendar("holidays",holidays,false,false);
//让 trigger 应用指定的日历规则
scheduler.scheduleJob(jobDetail,simpleTrigger);
scheduler.start();
}
}
定时任务增删改查
参考 Scheduler 源码中的方法
通过配置文件定义每个任务的属性,项目启动后将每个任务加载到内存中,将其中一个任务用来监听配置文件的修改,当其修改后动态刷新任务
#定时任务
quartz:
jobs:
- name: myName #(随便取任务名)
group: collect
cron: 0 0/5 * * * ? *
jobClass: com.gamer.me.quartz.jobs.MyJob #(自己的定时任务的执行类,也就是你写业务代码的类)
desc: 我的任务
@Data
public class SchedulerJob {
private String name;
private String group;
private String cron;
private String jobClass;
private String desc;
}
@Data
@Component
@ConfigurationProperties(prefix = "quartz")
public class SchedulerJobs {
private List<SchedulerJob> jobs;
}
@Slf4j
@Component
public class SchedulerManager {
@Autowired
private Scheduler scheduler;
/**
* 激活任务
* @param schedulerJob
*/
public void activeJob(SchedulerJob schedulerJob){
JobKey jobKey = JobKey.jobKey(schedulerJob.getName(), schedulerJob.getGroup());
try {
if (scheduler.checkExists(jobKey) && !MonitorCronJob.JOB_NAME.equals(schedulerJob.getName())) {
updateJob(schedulerJob);
}else {
createJob(schedulerJob);
}
} catch (SchedulerException e) {
logger.error("activeJob {}", e);
}
}
/**
* 创建任务并加入调度
* @param schedulerJob
*/
public void createJob(SchedulerJob schedulerJob){
JobKey jobKey = JobKey.jobKey(schedulerJob.getName(), schedulerJob.getGroup());
try {
if (scheduler.checkExists(jobKey)) {
return;
}
Class<?> clazz = Class.forName(schedulerJob.getJobClass());
JobDetail jobDetail = getJobDetail(schedulerJob, (Class<Job>) clazz);
Trigger cronTrigger = getCronTrigger(schedulerJob);
//加入调度器
scheduler.scheduleJob(jobDetail, cronTrigger);
} catch (ClassNotFoundException | SchedulerException e) {
logger.error("createJob {}", e);
}
}
/**
* 更新任务触发器
* @param schedulerJob
*/
public void updateJob(SchedulerJob schedulerJob){
TriggerKey triggerKey = TriggerKey.triggerKey(schedulerJob.getName(), schedulerJob.getGroup());
try {
Trigger trigger = scheduler.getTrigger(triggerKey);
if (trigger == null) {
return;
}
JobKey jobKey = trigger.getJobKey()