package com.quartz.fsl.test.example8;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import com.qdwb.mlxc.util.LogSelf;
public class SimpleJob implements Job {
public void execute(JobExecutionContext context)
throws JobExecutionException {
JobKey jobKey = context.getJobDetail().getKey();
LogSelf.fslLog.info("SimpleJob 的JOB名称: " + jobKey + " 任务调度时间: "+ new Date());
}
}
---------------------------------------------------------------------------------------
package com.quartz.fsl.test.example8;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.AnnualCalendar;
import com.qdwb.mlxc.util.LogSelf;
/*
* 在实际任务调度中,我们不可能一成不变地按照某个周期性的调度规则运行任务,
* 必须考虑到实现生活中日历上特定日期,就象习惯了大男人作风的人在2月14号也会有不同表现一样。
*/
public class CalendarExample {
public void run() throws Exception {
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
//①法定节日是以每年为周期的,所以使用AnnualCalendar
AnnualCalendar holidays = new AnnualCalendar(); // 常用日历
/*
* 日历(Calendars) Quartz
* Calendar对象(不是java.util.Calendar对象)能够与被注册进Scheduler的Trigger关联
* 。Calendar对排除Trigger的时间段是很有用的,
* 例如,我们可以创建一个在2014-06-30上午9:30触发Job的Trigger,就在其中增加一个排除所有工作假期的Calendar。
*/
//这个cal有问题,此处我本想设置成当天6月30日15点42分时算假期,不执行,但效果却是不论我怎么设置,都是不执行
Calendar cal = new GregorianCalendar(2014,5,30);
// cal.set(cal.HOUR, 15);
// cal.set(cal.MINUTE,42);
// // cal.set(cal.SECOND,);
// //cal.set(cal.MILLISECOND, 0);
holidays.setDayExcluded(cal, true); // 不包含
//②五一劳动节
Calendar laborDay = new GregorianCalendar();
laborDay.add(Calendar.MONTH,4);
laborDay.add(Calendar.DATE,1);
holidays.setDayExcluded(laborDay, true); //②-1:排除的日期,如果设置为false则为包含
Calendar christmas = new GregorianCalendar(2014, 11, 25); //月范围是:0-11
holidays.setDayExcluded(christmas, true);
//④向Scheduler注册日历
sched.addCalendar("holidays", holidays, false, false);
Date runDate = DateBuilder.dateOf(0, 0,15, 30,5); // 开始时间:6月30号的第15秒时
JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job1",
"group1").build();
// 每30秒执行一次
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1").startAt(runDate)
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(30).repeatForever())
.modifiedByCalendar("holidays").build();
//trigger.setCalendarName("holidays");⑥让Trigger应用指定的日历规则
Date firstRunTime = sched.scheduleJob(job, trigger);
LogSelf.fslLog.info(job.getKey() + " 将会运行时间: " + firstRunTime
+ " 重复次数: " + trigger.getRepeatCount() + " 次,每隔"
+ (trigger.getRepeatInterval() / 1000L) + " 秒");
LogSelf.fslLog.info("------- 手动触发Scheduler ----------------");
sched.start();
LogSelf.fslLog.info("-------睡眠5分钟... --------------");
try {
Thread.sleep(300000L);
} catch (Exception e) {
}
LogSelf.fslLog.info("-------停止调度---------------------");
sched.shutdown(true);
SchedulerMetaData metaData = sched.getMetaData();
LogSelf.fslLog.info("Executed " + metaData.getNumberOfJobsExecuted()
+ " jobs.");
}
public static void main(String[] args) throws Exception {
CalendarExample example = new CalendarExample();
example.run();
}
}