如何在spring项目中使用quartz定时任务
先说一下起因:为什么我会接触到quartz?
这是几天前的事了,我在QQ群里认识了哥们,他有一个问题没有搞定,然后我通过远程帮他搞定了,从那以后我们也就认识了,自从帮那个哥们解决完那个问题以后,他就一直在弄一个定时任务的东西,一直问我,但是那几天我比较忙,一直在忙自己公司的东西也就没有时间回复他消息,但是过了一周了,那个小哥还在问我quartz的问题…让我远程控制他给他看一下,由于我公司的网不行实在不愿意给别人看代码,我说我帮你写一个吧…
我眼中的定时任务,如下图
写代码之前的思考
我们主要分析一下,这种定时任务在后台管理系统中是最常见的,这就是定时任务增删改查
新增任务,删除任务,暂停任务,恢复任务,修改任务
等一系列的操作,根绝需求我们挨个的写出来,首先是新增。
分析代码流程
我们分析一下,所谓定时任务,就是定时去执行任务,首先首要的要素就是要有一个任务,所以我们要有一个任务类,然后我们选择quartz的定时功能来实现对任务类的执行,quartz翻译过来就是石英,明面上的意思已经很明白了,它就是一个对石英表功能的一个实现,钟表有什么功能呢,就是到点就会鸣钟,也就是一个定时任务,但是我觉得quartz比作闹钟会更加贴切,闹钟的任务就是到了你设定的时间就会响铃,现在有些手机可以定时开关机了,响铃和开关机就是定时任务要做的任务不是嘛?和我们要实现的功能是一样的,如果您理解了就请往下看。
创建一个任务类SampleParamJob.java
定时任务定时任务,quartz只给我们实现了定时执行任务的功能,执行什么任务呢?当然由我们自己开写代码咯!
我们的自定义任务类需要实现quartz的Job接口
/**
* 示例带参定时任务
*
* @author Yancary
*/
@Slf4j
public class SampleParamJob implements Job {
/**
* 若参数变量名修改 QuartzJobController中也需对应修改
*/
private String parameter;
public void setParameter(String parameter) {
this.parameter = parameter;
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.info(String.format("接收到的参数是 %s! :" + LocalDate.now(), this.parameter));
}
}
有了要执行的任务我们来写新增定时任务
新增定时任务方法写完了,但是quartz希望我们传一个任务类,这也就解释了为什么我们自定义的任务类需要实现quartz的Job接口了,然后我们需要再写一个工具方法getClass()
/**
* 添加定时任务
*
* @param jobClassName
* @param cronExpression
* @param parameter
*/
public void add(String jobClassName, String cronExpression, String parameter) {
try {
// 启动调度器
scheduler.start();
//构建job信息
JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass())
.withIdentity(jobClassName)
.usingJobData("parameter", parameter)
.build();
//表达式调度构建器(即任务执行的时间) 使用withMisfireHandlingInstructionDoNothing() 忽略掉调度暂停过程中没有执行的调度
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
//按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName)
.withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
} catch (Exception e) {
}
}
getClass()方法代码具体实现
这里我就不解释了,通过反射获取任务
public static Job getClass(String classname) throws Exception {
Class<?> class1 = Class.forName(classname);
return (Job) class1.newInstance();
}
再写一个添加定时任务的测试
我们有了任务也有了定时器,现在就让我们来实现添加一个定时任务的方法吧!
- 我们再来分析一下代码,定时任务需要的几个参数,第一个就是我们的全类名,上面写了一个方法,就是通过任务类的全类名得到Job类的方法:getClass(),
- 需要一个cron表达式,下面的代码可以看出,我写的cron表达式的意思是每秒执行一次
- 最后调用上面写好的add方法来实现定时任务的添加,怎么样是不是感觉很简单呢!?
QuartzJob job = new QuartzJob();
job.setJobClassName("cn.soudache.quartzdemo.jobs.SampleParamJob");
job.setCronExpression("* * * * * ? *");
job.setParameter("param1");
add(job.getJobClassName(), job.getCronExpression(), job.getParameter());
后面的废话我们也不多说,写完添加,我们再来写删除,直接上代码!
删除也很简单,全都是quartz提供的接口,我们只需要传一个任务的全类名就行了,非常简单!
/**
* 删除定时任务
*
* @param jobClassName
*/
public void delete(String jobClassName) {
try {
scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName));
scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName));
scheduler.deleteJob(JobKey.jobKey(jobClassName));
} catch (Exception e) {
}
}
暂停任务
暂停甚至比删除任务更加简单,代码如下
void stopJob() throws SchedulerException {
QuartzJob job = new QuartzJob();
job.setJobClassName("cn.soudache.quartzdemo.jobs.SampleParamJob");
scheduler.pauseJob(JobKey.jobKey(job.getJobClassName()));
}
恢复任务
恢复是暂停相反的功能
void ResetJob() throws SchedulerException {
QuartzJob job = new QuartzJob();
job.setJobClassName("cn.soudache.quartzdemo.jobs.SampleParamJob");
scheduler.resumeJob(JobKey.jobKey(job.getJobClassName()));
}
我们就写到这里吧,基本上功能都可以实现了,quartz非常的强大,我们写起代码来也非常的简单有木有,如果大家喜欢我的技术博客,别忘了关注我哟~我的代码都会上传到git,大家如果需要,也可以直接去git上面去clone
- Github地址: quartz-demo