1.前言
Spring 内置了quartz框架,可以对方法上注解或者在配置文件里配置定时任务。但是如果需要对这些任务进行管理(增删该查)的话不知道能不能做,反正我这渣渣是不知道的,所有我就自己整合了Quartz。
2.步骤
2.1 引入相关jar包
pom.xml
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
2.2 定时器执行任务类编写
ListenJob.java
//保留任务执行后的数据,例如操作JobDataMap
@PersistJobDataAfterExecution
//不允许并非执行任务
@DisallowConcurrentExecution
public class ListenJob implements Job{
//实现Job接口的方法
public void execute(JobExecutionContext content) throws JobExecutionException {
/*任务执行内容在这里编写*/
System.out.println("do something");
}
}
2.3 一个任务类的执行需要有它的调度器,接下来编写调度器
Scheduler.java
//这个@Service很关键
@Service
public class SchedulerJob{
//通过schedulerFactory获取一个调度器
SchedulerFactory schedulerfactory = new StdSchedulerFactory();
Scheduler scheduler = null;
//添加任务
public void addJob(){
// 通过schedulerFactory获取一个调度器
scheduler = schedulerfactory.getScheduler();
//初始化任务名和组名
String jobName = "jobName";
String jobGroupName = "jobGroupName";
//初始化任务(ListenJob.class)
JobDetail job = JobBuilder.newJob(ListenJob.class).withIdentity(jobName,jobGroupName).build();
//设置任务开始时间
Date startTime = new Date();
//设置任务结束时间(开始时间一小时后)
Date endTime = new Date(startTime.getTimer()+1000*60*60);
//初始化任务的触发器(起止时间,repeatSecondlyForever(1)表示每秒执行一次)
SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger().startAt(startTime).endAt(endTime).withIdentity("triggerName", "triggerGroupName") .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).repeatForever()).build();
//添加任务到调度器
scheduler.scheduleJob(job, simpleTrigger);
//开始执行
if(!scheduler.isStarted()){
scheduler.start();
}
}
//暂停任务
public void pauseJob(){
//调度器为空
if(scheduler==null){
return;
}
try {
//触发器和任务都要暂停
scheduler.pauseTrigger(new TriggerKey("triggerName","triggerGroupName"));
scheduler.pauseJob(new JobKey("jobName"));
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//恢复调度器
public void resumeJob(){
//
if(scheduler==null){
return;
}
//
try {
scheduler.resumeJob(new JobKey("jobName"));
scheduler.resumeTrigger(new TriggerKey("triggerName","triggerGroupName"));
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//删除任务
public void deleteJob(){
if(scheduler==null){
return;
}
//JobKey对象
JobKey jobKey = new JobKey("jobName");
//触发器
TriggerKey triggerKey = TriggerKey.triggerKey("triggerName", "triggerGroupName");
try {
// 停止触发器
scheduler.pauseTrigger(triggerKey);
// 移除触发器
scheduler.unscheduleJob(triggerKey);
//删除任务
scheduler.deleteJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//修改任务
public void alterJob(){
// 创建一个新的触发器
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
// 新触发器名,触发器组
triggerBuilder.withIdentity("newTriggerName", "newTriggerGroupName");
// 新触发器条件设置
triggerBuilder.startNow();
triggerBuilder.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2).repeatForever());
// 创建Trigger对象
SimpleTrigger trigger = (SimpleTrigger)triggerBuilder.build();
//旧的触发器
TriggerKey triggerKey = TriggerKey.triggerKey("triggerName", "triggerGroupName");
try {
//修改触发器
scheduler.rescheduleJob(triggerKey, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
3.总结
以上代码是在编辑器直接写的,还没跑过。如有错误还请告知。
实际开发中,我们还需要更多的功能,例如,任务参数的传递,数据持久化,任务监听。