在实际任务调度中,我们不可能一成不变地按照某个周期性的调度规则运行任务,必须考虑到实现生活中日历上特定日期,就象习惯了大男人作风的人在2月14号也会有不同表现一样。下面,我们安排一个任务,每小时运行一次,并将五一节和国际节排除在外,其代码如下:
package com.zchen.study.quartz;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class SimpleQuartzJob implements Job{
public SimpleQuartzJob() {
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("In SimpleQuartzJob - executing its JOB at "
+ new Date() + " by " + context.getTrigger().getName());
}
}
package com.zchen.study.quartz;
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.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.AnnualCalendar;
public class CalendarExample {
public static void main(String[] args) throws Exception {
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
// ①法定节日是以每年为周期的,所以使用AnnualCalendar
AnnualCalendar holidays = new AnnualCalendar();
// ②五一劳动节
Calendar laborDay = new GregorianCalendar();
laborDay.add(Calendar.MONTH, 5);
laborDay.add(Calendar.DATE, 1);
// ②-1:排除的日期,如果设置为false则为包含
holidays.setDayExcluded(laborDay, true);
// ③国庆节
Calendar nationalDay = new GregorianCalendar();
nationalDay.add(Calendar.MONTH, 10);
nationalDay.add(Calendar.DATE, 1);
// ③-1:排除该日期
holidays.setDayExcluded(nationalDay, true);
// ④向Scheduler注册日历
scheduler.addCalendar("holidays", holidays, false, false);
// ⑤4月1号 上午10点
Date runDate = TriggerUtils.getDateOf(0, 0, 10, 1, 4);
JobDetail job = new JobDetail("job1", "group1", SimpleQuartzJob.class);
SimpleTrigger trigger = new SimpleTrigger("trigger1", "group1",
runDate, null, SimpleTrigger.REPEAT_INDEFINITELY,
60L * 60L * 1000L);
// ⑥让Trigger应用指定的日历规则
trigger.setCalendarName("holidays");
scheduler.scheduleJob(job, trigger);
scheduler.start();
// 实际应用中主线程不能停止,否则Scheduler得不到执行,此处从略
}
}
由于节日是每年重复的,所以使用org.quartz.Calendar的AnnualCalendar实现类,通过②、③的代码,指定五一和国庆两个节日并通过AnnualCalendar#setDayExcluded(Calendar day, boolean exclude)方法添加这两个日期。exclude为true时表示排除指定的日期,如果为false时表示包含指定的日期。
在定制好org.quartz.Calendar后,还需要通过Scheduler#addCalendar(String calName, Calendar calendar, boolean replace, boolean updateTriggers)进行注册,如果updateTriggers为true,Scheduler中已引用Calendar的Trigger将得到更新,如④所示。
在⑥处,我们让一个Trigger指定使用Scheduler中代表节日的Calendar,这样Trigger就会避开五一和国庆这两个特殊日子了。
分享到:
相关推荐
在 myeclipse6.0.1下调试成功可直接运行的spring的quartz的例子,很适合刚接触quartz调度学习。
定时器框架学习资料,入门手册,新手专用!帮你快速入门开发搭建自己的定时器框架环境
Quartz框架快速入门Quartz框架快速入门
quartz入门共3页.pdf.zip
Quartz入门Demo,栗子全,注释详细。还有Spring结合的demo,一共两个Demo外加Quartz开发资料,绝对超值。欢迎大家共同交流。
Quartz定时器从入门到进阶,详细介绍Quartz定时器API和使用示例。
非常详细的Quartz详细入门教程。新手值得一看,高手请忽略。
quartz scheduler getting started 的翻译
Quartz详细入门教程.zip
Quartz中文入门教程 前言 Quartz让任务调度简单 Quartz的发展史 上手Quartz Quartz内部架构 作业 作业管理和存储 有效作业存储 作业和触发器 调度一个作业 用调度器(Scheduler)调用你的作业 编程调度...
Quartz如何从入门到精通
Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群...
Quartz 框架快速入门 在前面两篇文章中简单介绍了在java应用程序中如何使用Quartz框架,这一篇中我们将看到如何在web环境下通过配置文件来完成Quartz的后台作业调度,而不必手工去创建Trigger和Scheduler
Quartz概述及入门实例,具体过程和效果看博文 http://blog.csdn.net/evankaka/article/details/45361469
Quartz框架快速入门.pdf
Quartz入门教程,快如上手,讲解明了易懂
文件里面包括 1:Quartz开发指南.pdf 2:Quartz从入门到进阶.pdf 3:QuartzBeginnerExample一个附带的工程例子 4:quartz-1.6.1.zip Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它...
Quartz从入门到精通.doc 定时,调度