如果要在触发器的基础上,排除一些时间区间不执行任务,就要用到 Quartz的Calendar类(注意不是 JDK的 Calendar)。可以按年、月、周、日、特定日期、Cron表达式排除。
调用 Trigger的 modifiedByCalendar()添加到触发器中,并且调用调度器的addCalendar()方法注册排除规则。
public class CalendarDemo {
public static void main(String[] args) throws Exception {
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
scheduler.start();
// 定义日历
AnnualCalendar holidays = new AnnualCalendar();
// 排除咕泡日
Calendar gupaoDay = (Calendar) new GregorianCalendar(2019, 8, 8);
holidays.setDayExcluded(gupaoDay, true);
// 排除中秋节
Calendar midAutumn = new GregorianCalendar(2019, 9, 13);
holidays.setDayExcluded(midAutumn, true);
// 排除圣诞节
Calendar christmas = new GregorianCalendar(2019, 12, 25);
holidays.setDayExcluded(christmas, true);
// 调度器添加日历
scheduler.addCalendar("holidays", holidays, false, false);
JobDetail jobDetail = JobBuilder.newJob(MyJob1.class)
.withIdentity("job1", "group1")
.usingJobData("leon","2673")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.modifiedByCalendar("holidays")
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2)
.repeatForever())
.build();
Date firstRunTime = scheduler.scheduleJob(jobDetail, trigger);
System.out.println(jobDetail.getKey() + " 第一次触发: " + firstRunTime);
}
}
Calendar 名称 | 用法 |
---|---|
BaseCalendar | 为高级的Calendar 实现了基本的功能,实现了org.quartz.Calendar 接口 |
AnnualCalendar | 排除年中一天或多天 |
CronCalendar | 日历的这种实现排除了由给定的CronExpression 表达的时间集合。例如, 您可以使用此日历使用表达式“* * 0-7,18-23?* *”每天排除所有营业时 间(上午8 点至下午5 点)。如果CronTrigger 具有给定的cron 表达式并 且与具有相同表达式的CronCalendar 相关联,则日历将排除触发器包含的 所有时间,并且它们将彼此抵消。 |
DailyCalendar | 您可以使用此日历来排除营业时间(上午8 点- 5 点)每天。每个 DailyCalendar 仅允许指定单个时间范围,并且该时间范围可能不会跨越每 日边界(即,您不能指定从上午8 点至凌晨5 点的时间范围)。如果属 性invertTimeRange 为false(默认),则时间范围定义触发器不允许触发 的时间范围。如果invertTimeRange 为true,则时间范围被反转- 也就是 排除在定义的时间范围之外的所有时间。 |
HolidayCalendar | 特别的用于从Trigger 中排除节假日 |
MonthlyCalendar | 排除月份中的指定数天,例如,可用于排除每月的最后一天 |
WeeklyCalendar | 排除星期中的任意周几,例如,可用于排除周末,默认周六和周日 |