不要混淆了 Quartz 的 Calendar 对象与 Java API 的 java.util.Calendar。它们是应用于不同目的不一样的组件。
Java 的 Calendar 对象是通用的日期和时间工具;许多过去由 Java 的 Date 类提供的功能现在加到了 Calendar 类中了。
Quartz 的 Calendar 专门用于屏闭一个时间区间,使 Trigger 在这个区间中不被触发。
Calendar 排除时间的粒度:
Calendar 接口方法参数的类型是 Long。这说明 Quartz Calendar 能够排除的时间细致毫秒级。你很可能永远都不需要这么细小的位度,因为大部分的 Job 只需要排除特别的日期或许会是小时。然而,假如你真需要排除到毫秒一级的,Calendar 能帮你做到
Quartz 自带的随时可用的 Calendar。
Quartz的BaseCalendar层次结构如下:
参考API:http://www.quartz-scheduler.org/api/2.2.1/index.html
Calendar 名称类用法
BaseCalendarorg.quartz.impl.calendar.BaseCalendar为高级的 Calendar 实现了基本的功能,实现了 org.quartz.Calendar 接口
AnnualCalendarorg.quartz.impl.calendar.AnnualCalendar排除年中一天或多天
CronCalendarorg.quartz.impl.calendar.CronCalendar日历的这种实现排除了由给定的CronExpression表达的时间集合。 例如,您可以使用此日历使用表达式“* * 0-7,18-23?* *”每天排除所有营业时间(上午8点至下午5点)。
如果CronTrigger具有给定的cron表达式并且与具有相同表达式的CronCalendar相关联,则日历将排除触发器包含的所有时间,并且它们将彼此抵消。
DailyCalendarorg.quartz.impl.calendar.DailyCalendar您可以使用此日历来排除营业时间(上午8点 - 5点)每天。 每个DailyCalendar仅允许指定单个时间范围,并且该时间范围可能不会跨越每日边界(即,您不能指定从上午8点至凌晨5点的时间范围)。 如果属性invertTimeRange为false(默认),则时间范围定义触发器不允许触发的时间范围。 如果invertTimeRange为true,则时间范围被反转 - 也就是排除在定义的时间范围之外的所有时间。
HolidayCalendarorg.quartz.impl.calendar.HolidayCalendar特别的用于从 Trigger 中排除节假日
MonthlyCalendarorg.quartz.impl.calendar.MonthlyCalendar排除月份中的指定数天,例如,可用于排除每月的最后一天
WeeklyCalendarorg.quartz.impl.calendar.WeeklyCalendar排除星期中的任意周几,例如,可用于排除周末,默认周六和周日
注意,所有的Calendar既可以是排除,也可以是包含,取决于:AnnualCalendar:指定每年的哪一天。使用方式如上例。精度是【天】
CronCalendar:指定Cron表达式。精度取决于Cron表达式,也就是最大精度可以【到秒】
DailyCalendar:指定每天的时间段(rangeStartingTime, rangeEndingTime),格式是HH:MM[:SS[:mmm]]。也就是最大精度可以【到毫秒】
HolidayCalendar:指定特定的日期,比如20140613。精度到【天】
MonthlyCalendar:指定每月的几号。可选值为1-31。精度是【天】
WeeklyCalendar:指定每星期的星期几,可选值比如为java.util.Calendar.SUNDAY。精度是【天】
使用 Quartz 的 Calendar源码示例
要使用 Quartz Calendar,你只需简单的实例化,并加入你要排除的日期,然后用 Scheduler 注册它。最后把这个 Calendar 实例与你想要使用该Calendar 的每一个 Trigger 实例关联起来
AnnualCalendar
示例:import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.AnnualCalendar;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import static org.quartz.DateBuilder.dateOf;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
/**
* 此示例将演示如何使用日历来排除不应该进行调度的时间段。
*/
public class CalendarExample {
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("------- 初始化 ----------");
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
// 声明一个节假日 holidayCalendar,标明要排除的日期
// 法定节日是以每年为周期的,所以使用AnnualCalendar而不是HolidayCalendar
AnnualCalendar holidays = new AnnualCalendar();
Calend