在项目中需要使用到任务调度的功能,搜索了资料发现了quartz这个java任务调度框架,并且spring3.1以上的版本默认支持quartz,只需要在配置文件中配置一些信息,就能够把调度任务跑起来,确实很方便。后来,需求有变,我们的任务调度是要能够动态修改的,也就是说能够自由随时修改调度时间/状态,启动或者停止任务。很显然,spring配置调度任务是不能实现动态配置的,我们不可能每修改一次就要重新修改配置文件和重新启动项目的,那也就是说,要自己集成quartz到spring中。(第一次写博客,写的不好请见谅)
当然,首先我们要先了解quartz这个框架的基本用法
要使用quartz 我们需要导入一个jar包,这里使用的是 quartz-2.2.1.jar 2.2.1版本
我们先来介绍一下quartz任务调度用的几个类
Job 是一个接口,里面有个方法execute,也就是我们任务逻辑执行的方法,使用的时候我们会新建一个类去实现这个 Job 类
JobDetail 是一个任务的信息类,通过任务名以及组名去标记一个唯一的任务,并且制定一个
Job对象作为任务的执行类,
Trigger
是任务的触发器,主要任务是设置任务触发的时间点以及任务的信息,以任务名和组名作为唯一标记,
Scheduler是任务的调度器,管理任务的启动,停止,重置,当我们把
JobDetail 和
Trigger注册到调度器中时,会产生两个key,分别是
JobKey和
TrigggerKey,都以任务名和组名作为唯一标识。
JobBulider是创建JobDetail对象的接口
TriggerBulider是创建Trigger对象的接口
下面 我们通过一个例子来创建一个调度任务
首先,新建一个类去实现Job 接口类 作为任务执行类:
public class JobExecute implements Job {
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
// TODO Auto-generated method stub
//拿到执行的任务名
String jobname=arg0.getJobDetail().getKey().getName();
System.out.println(jobname);
}
}
然后我们新建一个main方法的测试类:特别注意的是 使用cronSchedule()方法时 要亲自导入 import static org.quartz.CronScheduleBuilder.cronSchedule 才能使用
不懂cron时间表达式的百度一下就知道了
public class test2 {
public static void main(String[] args) {
try {
//创建调度器工厂类
SchedulerFactory sFactory = new StdSchedulerFactory();
//通过工厂类拿到调度器对象
Scheduler scheduler = sFactory.getScheduler();
//拿到任务执行信息类
JobDetail jobDetail=JobBuilder.newJob(JobExecute.class)
.withIdentity("jobName", "jobGroup")
.build();
//创建一个触发器
Trigger trigger=TriggerBuilder.newTrigger()
.withIdentity("jobName", "jobGroup")
//表示的是每天的18点17分 从0秒开始每隔5秒执行一次
.withSchedule(cronSchedule("0/5 18 17 * * ?"))
.forJob(jobDetail)
.build();
scheduler.scheduleJob(jobDetail, trigger);
//启动任务
scheduler.start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
此时控制台输出一下内容
Quartz的基本使用就是这样,下一节,我们将处理在项目中如何集成spring和动态配置调度任务