Quartz——Calendar详解
转载请出自出处:http://eksliang.iteye.com/blog/2208333
一.概述
在实际任务调度中,我们不可能一成不变地按照某个周期性的调度规则运行任务,必须考虑到实现生活中日历上特定日期,就像习惯了大男人作风的人在2月14号也会有不同表现一样。
二.Quartz的Calendar介绍
1)Quartz的Calendar层次结构
在本例中主要用到了AnnualCalendar,它的作用是排除排除每一年中指定的一天或多天.
2)其它相应的Calendar的含义如下
- CronCalendar:使用表达式排除某些时间段不执行
- DailyCalendar:指定的时间范围内的每一天不执行
- HolidayCalendar:排除节假日
- MonthlyCalendar:排除月份中的数天
- WeeklyCalendar:排除星期中的一天或多天
三.参考实例
简单的Job实现类:打印任务详情
package com.ickes.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* 实现Job接口,定义运行的任务
* @author Ickes
*/
public class SimpleJob implements Job {
public void execute(JobExecutionContext context)
throws JobExecutionException {
//打印任务详情
System.out.println(
context.getJobDetail().getGroup()
+"——"+context.getJobDetail().getName()
+"——"+context.getTrigger().getName()
+"——"+context.getTrigger().getGroup());
}
}
使用simpleTrigger对SimpleJob进行调度,让它每2秒钟运行一次,并将五一劳动节和万圣节排除在外,代码如下:
package com.ickes.job;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.AnnualCalendar;
/**
* @author Ickes
*/
public class CalendarDemo {
public static void main(String[] args) throws Exception {
//第一步:创建一个JobDetail实例
JobDetail jobDetail = new JobDetail("j_job1","j_group1", SimpleJob.class);
//第二步:通过SimpleTrigger触发器定义调度规则:马上启动,每2秒运行一次,共运行无数次
SimpleTrigger simpleTrigger = new SimpleTrigger("t_job1","t_group_1");
simpleTrigger.setStartTime(new Date());//开始运行时间
simpleTrigger.setRepeatInterval(2000); //运行间隔单位为毫秒
simpleTrigger.setRepeatCount(-1); //运行次数
//第三步:创建Quartz的Calendar,法定节日是以每年为周期的,所以使用AnnualCalendar
AnnualCalendar holidays = new AnnualCalendar();
//五一劳动节
Calendar laborDay = new GregorianCalendar(2015, 4, 1);
holidays.setDayExcluded(laborDay, true);//排除的日期,如果设置为false则为包含
//万圣节(31号)
Calendar halloween = new GregorianCalendar(2005, 9, 31);
holidays.setDayExcluded(halloween, true);//排除该日期
//第四步:通过SchedulerFactory获取一个调度器实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
//第五步:向Scheduler注册日历
scheduler.addCalendar("holidays", holidays, false, false);
//第六步:让Trigger应用指定的日历规则
simpleTrigger.setCalendarName("holidays");
//第七步:将job跟trigger注册到scheduler中进行调度
scheduler.scheduleJob(jobDetail, simpleTrigger);
//第八步:调度启动
scheduler.start();
}
}
第五步:向Scheduler注册日历Scheduler.addCalendar(String calName, Calendar calendar, boolean replace, boolean updateTriggers)如果updateTriggers为true,Scheduler中已引用Calendar的Trigger将得到更新