如何在项目中使用定时器框架Quartz的思路##
一、你需要在项目中加入quartz-all-2.1.7.jar的jar包
二、然后需要新建一个类去注册定时任务和销毁定时任务,这个类需要实现ServletContextListener的接口中的contextInitialized和contextDestroyed方法,完事之后还需要在web.xml中去监听这个新建的类
public class InitListener implements ServletContextListener {
public static Scheduler scheduler = null;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
try {
scheduler.shutdown();
System.out.print("定时器关闭!");
} catch (SchedulerException se) {
se.printStackTrace();
}
}
@Override
public void contextInitialized(ServletContextEvent sce) {
try {
// 获取Scheduler实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
// 具体任务
JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();
// 触发时间点
SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5).repeatForever();
// CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 */2 * * * ?"); 其实也可以用这种定义时间点,这个就表示每隔2分钟执行一次定时器里面的任务
//这个是定义对象触发器
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.startNow().withSchedule(simpleScheduleBuilder).build();
// 交由Scheduler安排触发
scheduler.scheduleJob(job, trigger);
/* 为观察程序运行,此设置主程序睡眠3分钟才继续往下运行(因下一个步骤是“关闭Scheduler”) */
try {
TimeUnit.MINUTES.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 关闭Scheduler
scheduler.shutdown();
} catch (SchedulerException se) {
logger.error(se.getMessage(), se);
}
}
}
三、接着就是去定义你自己的定时任务了,也就是再去新建一个类去实现Job的接口中的execute()方法,这个方法就是你在定时任务执行的时候要执行的内容
public class HelloJob implements Job {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// 此任务仅打印日志便于调试、观察
this.logger.debug(this.getClass().getName() + " trigger...");
//这个下面就需要写你自己需要的定时器需要真正执行的任务都写在这里
}
}
在定义你自己的时间触发器的时候,可以有以下几种选择:
1, SimpleTrigger 指定从某一个时间开始,以一定的时间间隔(单位是毫秒)执行的任务。也就是他是以毫秒来计时。
simpleSchedule()
.withIntervalInHours(1) //每小时执行一次
.repeatForever() //次数不限
.build();
simpleSchedule()
.withIntervalInMinutes(1) //每分钟执行一次
.withRepeatCount(10) //次数为10次
.build();
2, CalendarIntervalTrigger
类似于SimpleTrigger,指定从某一个时间开始,以一定的时间间隔执行的任务。 但是不同的是SimpleTrigger指定的时间间隔为毫秒,没办法指定每隔一个月执行一次(每月的时间间隔不是固定值),而CalendarIntervalTrigger支持的间隔单位有秒,分钟,小时,天,月,年,星期。相较于SimpleTrigger有两个优势:1、更方便,比如每隔1小时执行,你不用自己去计算1小时等于多少毫秒。 2、支持不是固定长度的间隔,比如间隔为月和年。但劣势是精度只能到秒。
它适合的任务类似于:9:00 开始执行,并且以后每周 9:00 执行一次
calendarIntervalSchedule()
.withIntervalInDays(1) //每天执行一次
.build();
calendarIntervalSchedule()
.withIntervalInWeeks(1) //每周执行一次
.build();
3.DailyTimeIntervalTrigger
指定每天的某个时间段内,以一定的时间间隔执行任务。并且它可以支持指定星期。
它适合的任务类似于:指定每天9:00 至 18:00 ,每隔70秒执行一次,并且只要周一至周五执行。
dailyTimeIntervalSchedule()
.startingDailyAt(TimeOfDay.hourAndMinuteOfDay(9, 0)) //第天9:00开始
.endingDailyAt(TimeOfDay.hourAndMinuteOfDay(16, 0)) //16:00 结束
.onDaysOfTheWeek(MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY) //周一至周五执行
.withIntervalInHours(1) //每间隔1小时执行一次
.withRepeatCount(100) //最多重复100次(实际执行100+1次)
.build();
dailyTimeIntervalSchedule()
.startingDailyAt(TimeOfDay.hourAndMinuteOfDay(9, 0)) //第天9:00开始
.endingDailyAfterCount(10) //每天执行10次,这个方法实际上根据 startTimeOfDay+interval*count 算出 endTimeOfDay
.onDaysOfTheWeek(MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY) //周一至周五执行
.withIntervalInHours(1) //每间隔1小时执行一次
.build();
4.CronTrigger
适合于更复杂的任务,它支持类型于Linux Cron的语法(并且更强大)。基本上它覆盖了以上三个Trigger的绝大部分能力(但不是全部)—— 当然,也更难理解。
它适合的任务类似于:每天0:00,9:00,18:00各执行一次。
cronSchedule("0 0/2 8-17 * * ?") // 每天8:00-17:00,每隔2分钟执行一次
.build();
cronSchedule("0 30 9 ? * MON") // 每周一,9:30执行一次
.build();
weeklyOnDayAndHourAndMinute(MONDAY,9, 30) //等同于 0 30 9 ? * MON
.build();