Quartz定时任务的核心是org.quartz.Scheduler,我们对定时任务的一系列的操作都需要它来执行。在与spring的集成中,我们使用如下配置来创建这个bean。
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" autowire="no">
<property name="configLocation" value="classpath:quartz.properties" />
</bean>
quartz.properties配置文件内容如下:
# 调度器的名字
org.quartz.scheduler.instanceName = WowojobScheduler
# 不使用RMI方式管理Quartz,使用 org.quartz.Scheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
# 在任务执行前是否使用事务
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
# 配置线程池
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 128
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = false
# 配置作业存储方式,相当于扫描频率,此处为1分钟
org.quartz.jobStore.misfireThreshold = 60000
# 利用通常的内存来持久化调度程序信息
org.quartz.jobStore.class =org.quartz.simpl.RAMJobStore
# 跳过更新检查(到quartz官网检查新版本)
org.quartz.scheduler.skipUpdateCheck: true
在执行定时任务时,还需要知道两个类:
org.quartz.JobDetail:它保存了定时任务的基本信息,如任务名称等。其创建方式如下:JobBuilder jobB = JobBuilder.newJob(clazz).withIdentity(jobName, Scheduler.DEFAULT_GROUP) ;
jobB.usingJobData(jobDataMap);
JobDetail jobDetail = jobB.build();
jobDataMap是org.quartz.JobDataMap类型的,以Map的形式存放了定时任务的一些信息。
clazz:就是真正要执行的定时任务的类。
org.quartz.Trigger:保存了定时任务的执行时间,可使用cron表达式或使用执行次数和执行间隔来构造。
使用cron表达式的方式构造如下:
TriggerBuilder<Trigger> triggerB = TriggerBuilder.newTrigger().withIdentity(triggerName, Scheduler.DEFAULT_GROUP);
triggerB.withSchedule(CronScheduleBuilder.cronSchedule(ronExpression));
Trigger trigger = triggerB.build();
使用执行次数和执行间隔构造如下:
TriggerBuilder<Trigger> triggerB = TriggerBuilder.newTrigger()
.withIdentity(triggerName),Scheduler.DEFAULT_GROUP);
triggerB.startAt(startTime);
triggerB.endAt(endTime);
SimpleScheduleBuilder ssb = simpleSchedule();
ssb.withRepeatCount(repeatCount);
ssb.withIntervalInMilliseconds(repeatInterval);
triggerB.withSchedule(ssb);
Trigger trigger = triggerB.build();
jobDetail和trigger构造之后,使用scheduler.scheduleJob(jobDetail,trigger);来加入调度。
以上都是一些准备工作,具体的定时任务执行类只需要实现org.quartz.Job这个接口,重写publicabstractvoidexecute(JobExecutionContext jobexecutioncontext) throws JobExecutionException;这个方法即可。
通过jobexecutioncontext对象,可以获取JobDetail对象和JobDataMap对象,从而获取定时任务的基本信息。示例代码如下:
public class NotifyService implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
JobDetail t = context.getJobDetail();
JobDataMap map = t.getJobDataMap();
}
}