一、Quartz基础知识
1、Quartz基础结构
(1)Job:接口,只有一个方法void execute(JobExecutionContext context),通过实现该接口来定义需要执行的任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中。
(2)JobDetail:Quartz在每次支持Job时,都重新创建一个Job实例,所以它不是直接接收一个Job实例,而是接受一个Job实现类,以便运行时通过newInstance()的反射机制实例化Job。通过JobDetail来描述Job的实现类及其他相关的静态信息,如Job名称、描述、关联监听器等信息。
(3)Trigger:描述触发Job执行的时间触发规则。主要有SimpleTrigger和CronTrigger这两个子类。当仅需触发一次或者以固定间隔周期性执行时,选择SimpleTrigger,而CronTrigger则可以通过Cron表达式定义出各种复杂的调度方法。
(4)Calendar:一个Trigger可以和多个Calendar关联,以便排除或包含某些时间点。Quartz提供了若干个Calendar的实现类,如AnnualCalendar、MonthlyCalendar、WeeklyCalendar分别针对每年、每月和每周进行定义。
(5)Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,二者在Scheduler中拥有各自的组及名称。组及名称是Scheduler查找定位容器中某一对象的依据。Scheduler可以将Trigger绑定到某一JobDetail中,这样,当Trigger被触发时,对应的Job就被执行。
(6)ThreadPool:Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程来提高运行效率。
2、使用SimpleTrigger
SimpleTrigger(String name,String group):通过构造函数指定Trigger所属组和名称。
SimpleTrigger(String name,String group,Date startTime):指定Trigger所属组、名称和触发的时间。
SimpleTrigger(String name,String group,Date startTime,Date endTime,int repeatCount,long repeatInterval):指定所属组、名称、开始时间、结束时间、重复执行次数、时间间隔。
SimpleTrigger(String name,String group,Date startTime,String jobName,String jobGroup,Date endTime,int repeatCount,long repeatInterval)在指定触发参数的同时,通过jobGroup和jobName,使该Trigger和Scheduler中的某个任务关联起来。
public class SimpleJob implements Job {
public void execute(JobExecutionContext jobCtx)
throws JobExecutionException {
System.out.println(jobCtx.getTrigger().getName()
+ " triggered. time is:" + (new Date()));
}
}
public class SimpleTriggerRunner {
public static void main(String args[]) {
try {
JobDetail jobDetail = new JobDetail("job1_1", "jgroup1",SimpleJob.class);
SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1_1","tgroup1");
simpleTrigger.setStartTime(new Date());
simpleTrigger.setRepeatInterval(2000);
simpleTrigger.setRepeatCount(100);
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, simpleTrigger);
scheduler.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、使用CronTrigger
(1)Cron表达式
1>星号(*):可用在所有字段中,表示对应时间域的每一个时刻。如:*在分钟字段表示每分钟。
2>问好(?):只在日期和星期字段中使用,相当于占位符。
3>减号(-):表示一个范围。如:10-12表示10点到12点
4>逗号(,):表示一个列表值。如:MON,WED,FRI表示星期一,星期但和星期五
5>斜杠(/):x/y表示一个等步长序列,x