package com.zbaccp.quartz.cl.example8;
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.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.AnnualCalendar;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
/**
* 本范例演示如何使用日历来排除一些时间,在这些排除的时间里排程任务不应当运行
*
* @author 常磊
*/
public class CalendarExample {
public void run() throws Exception {
final Log log = LogFactory.getLog(CalendarExample.class);
log.info("------- 开始初始化 ----------------------");
//1 排程实例化
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
log.info("------- 初始化结束 -----------");
log.info("------- 安排任务 -------------------");
//2 把假期日历加入排程,日历中的日期都被排除
AnnualCalendar holidays = new AnnualCalendar();
//2.1 7月4日, (独立日,没有想到这个俺也知道,看美国大片看的!有才,呵呵 )
Calendar fourthOfJuly = new GregorianCalendar(2005, 6, 4);
holidays.setDayExcluded(fourthOfJuly, true);
//2.2 10月31日,万圣节前夕
Calendar halloween = new GregorianCalendar(2005, 9, 31);
holidays.setDayExcluded(halloween, true);
//2.3 12月25日,christmas
Calendar christmas = new GregorianCalendar(2005, 11, 25);
holidays.setDayExcluded(christmas, true);
//2.4 将日历与加入排程
sched.addCalendar("holidays", holidays, false, false);
//3 任务每1小时执行一次,开始于万圣节前夕上午10点
//3.1 注意参数列表getDateOf(second,minute,hour,dayOfMonth,month)
Date runDate = TriggerUtils.getDateOf(0,0, 10, 31, 10);
JobDetail job = new JobDetail("job1", "group1", SimpleJob.class);
SimpleTrigger trigger = new SimpleTrigger("trigger1", "group1",
runDate,
null,
SimpleTrigger.REPEAT_INDEFINITELY,
60L * 60L * 1000L);
//3.2 触发器与排程中的日历关联
trigger.setCalendarName("holidays");
Date firstRunTime = sched.scheduleJob(job, trigger);
//3.3 打印job第一次运行的时间
//然而这个时间是万圣节前夕上午10点吗?
//想一想,前面我们已经把这一天排除了,哦,大家想起来了
//所以实际的运行时间是11月1日的凌晨
log.info(job.getFullName() +
" 初次运行时刻: " + firstRunTime +
" 重复: " + trigger.getRepeatCount() +
" 次, 运行间隔 " + trigger.getRepeatInterval() / 1000 + " 秒");
//4 启动排程
log.info("------- 启动排程 ----------------");
sched.start();
//5 任务只会在10月31日后的整点运行,所以嘛遇到的几率并不是很大
// 只好调计算机时间了
log.info("------- 请等待30秒钟... --------------");
try {
Thread.sleep(30L * 1000L);
} catch (Exception e) {
}
//6 关闭排程
log.info("------- 开始关闭 ---------------------");
sched.shutdown(true);
log.info("------- 关闭结束 -----------------");
SchedulerMetaData metaData = sched.getMetaData();
log.info("共执行工作 " + metaData.numJobsExecuted() + " 次");
}
public static void main(String[] args) throws Exception {
CalendarExample example = new CalendarExample();
example.run();
}
}