在服务器启动之后,定时的执行某些接口,实现某些特定的需求,监控数据库某几个字段。例如:数据库中有一张优惠券,当它的时间到期的时候,定时的更改他的状态为已过期,最好是每一天都定时查看数据库中的一些优惠券日期并更改状态。quartz很好的解决了这一个问题。
一、quartz下载
百度输入quartz,进入官网下载,或者http://www.quartz-scheduler.org/downloads/进行下载,目前最新版本是2.2.3。
**注意**的是:
使用最新版本的quartz与spring集成时,spring要是3.1×版本以上的,否则版本不兼容。
二、quartz的简单使用
1、解压缩刚才下载好的quartz包,打开lib文件夹,把里面的jar包添加到新建的maven工程下。
2、简单的使用
新建java类QuartzJobFactory,并实现接口Job,重写其唯一的方法execute。该类是在”特定的时间“下被执行,如下:
package com.lzt.testMain;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class QuartzJobFactory implements Job{
public void execute(JobExecutionContext context) throws JobExecutionException {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("hello myJob:"+sdf.format(date));
}
}
3、新建一个设置特定时间执行的类,也就是设置quartz相关的接口。Quartz API核心接口有:
Scheduler – 与scheduler交互的主要API;
Job – 你通过scheduler执行任务,你的任务类需要实现的接口;
JobDetail – 定义Job的实例;
Trigger – 触发Job的执行;
JobBuilder – 定义和创建JobDetail实例的接口;
TriggerBuilder – 定义和创建Trigger实例的接口;
TestQuartz类如下:
public class TestQuartz {
public static void main(String[] args) throws SchedulerException {
startSchedule();
//resumeJob();
}
public static void startSchedule() throws SchedulerException {
// 创建jobDetail实例,绑定Job实现类
// 指明job的名称,所在组的名称,以及绑定job类
JobDetail jobDetail = JobBuilder
.newJob(QuartzJobFactory.class)
.withIdentity("lztJob", "zflJob")
.build();
// 使用simpleTrigger规则
// 定义调度触发规则,比如每1秒运行一次,共运行5次
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("lztJob", "zflJob")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1).
withRepeatCount(10)).build();
//使用cornTrigger规则 每天17点02分
/* Trigger trigger=TriggerBuilder.newTrigger().withIdentity("lztJob2", "zflJob2")
.withSchedule(CronScheduleBuilder.cronSchedule("0 02 17 * * ? *"))
.startNow().build(); */
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
//添加job,以及其关联的trigger
scheduler.scheduleJob(jobDetail, trigger);
//启动job
scheduler.start();
//scheduler.shutdown();
}
}
4、执行:
得到如下结果:
quartz有很多种触发器,常被使用的就是simpleTrigger和cornTrigger。simpleTrigger规则即每隔多少秒执行一次,可以执行几次,从上面测试来看每一秒执行一次,共执行了10次,该种规则常常不能满足实际的需求,所以常常使用cornTrigger规则,该触发器具体到了某年某月某个星期几某天某时某分的执行,比起simpleTrigger来说更能满足实际需求。
把上面的trigger换成cornTrigger,simpleTrigger注释掉,执行,得到如下结果:
总结:上面该类实现定时执行,离不开三个东西,即Schduler,jobDetail,Trigger。jobDetail指明job的名称,所在组的名称,以及绑定job类 ,Trigger定义调度触发规则,Schduler可以看成是一个执行容器,把Trigger和Schduler放入其中加入到任务中实现调度。