什么是Quartz?
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.3 。--------------------百度百科
简单的来说,主要是用来执行定时任务。
核心体系
1.job:实现业务逻辑。
2.trigger:触发器(什么时候去调用)
3.scheduler:调度器(把job和trigger绑定再一起)
job
在job接口中只有一个方法就是execute方法。
package org.quartz;
public interface Job {
void execute(JobExecutionContext var1) throws JobExecutionException;
}
自己写一个业务逻辑实现这个接口
public class myjob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//这里取出jobdetail里的值
Object jv1 = jobExecutionContext.getJobDetail().getJobDataMap().get("jv1");
System.out.println("hello job"+jv1);
}
schedule
一个简单的实例:每两秒重复一次业务逻辑
public class myschedule {
public static void main(String[] args) throws SchedulerException {
//创建jobdetail
JobDetail job = JobBuilder
.newJob(myjob.class)
.withIdentity("job1","group1")
.build();
//在jobdetailmap里放入值
job.getJobDataMap().put("jv1","这是job");
//创建trigger
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("trigger1","group1")
.startAt(new Date()) //从现在开始
.withSchedule(SimpleScheduleBuilder //每隔两个秒重复一次
.repeatSecondlyForever(2))
.build();
//创建一个scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//注册trigger并启动scheduler
scheduler.scheduleJob(job,trigger);
scheduler.start();
}
}
结果是每隔两秒就是hello job和jobdetail里的值
为什么要有job和jobdetail两个类?
在上面的实例中我们传给scheduler一个JobDetail实例,因为我们在创建JobDetail时,将要执行的job的类名传给了JobDetail,所以scheduler就知道了要执行何种类型的job;每次当scheduler执行job时,在调用其execute(…)方法之前会创建该类的一个新的实例;执行完毕,对该实例的引用就被丢弃了,实例会被垃圾回收;这种执行策略带来的一个后果是,job必须有一个无参的构造函数(当使用默认的JobFactory时);另一个后果是,在job类中,不应该定义有状态的数据属性,因为在job的多次执行中,这些属性的值不会保留。
jobdetailmap的作用?
在Job执行时,JobExecutionContext中的JobDataMap为我们提供了很多的便利。它是JobDetail中的JobDataMap和Trigger中的JobDataMap的并集,但是如果存在相同的数据,则后者会覆盖前者的值。
所以jobdetailmap主要作用是在各个地方实现数据的传递。
trigger
trigger分为SimpleTrigger和CronTrigger。
SimpleTrigger可以满足的调度需求是:在具体的时间点执行一次,或者在具体的时间点执行,并且以指定的间隔重复执行若干次。
CronTrigger是基于日历的概念指定间隔进行重新启动的作业启动计划。
上面已经演示了simpleTrigger,这里写一个CronTrigger
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.withSchedule(cronSchedule("0 0/2 8-17 * * ?"))
.forJob("myJob", "group1")
.build();
0 0/2 8-17 * * ?,按照顺序分别是秒 分 时 日 月 年 ,其中?后面代表着允许星期几的字段。*代表是通配符代表每个(每个月,每天,每小时),0/2 代表着每隔两分钟
上面这个表示为每天上午8点至下午5点之间每隔一分钟触发一次。
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.withSchedule(weeklyOnDayAndHourAndMinute(DateBuilder.WEDNESDAY, 10, 42))
.forJob(myJobKey)
.inTimeZone(TimeZone.getTimeZone("America/Los_Angeles"))
.build();
这是另一种方式。
上面这么表示为将在星期三上午10:42在TimeZone(系统默认值)之外触发。