定时任务,我们每个系统都会涉及到的内容,今天我们来说说,可配置,可控制的定时任务—— quartz
我们将定时任务定义为一个微服务模块,专职跑定时任务。
quartz是由java编写的一个作业调度框架,说的直白点他就是专门的定时任务框架。
定时任务实现的过程
任务实体的c r u d 操作,实际上是相应任务的实体类添加到了scheduler中,实体类中相对应的具体实现方法。
实现具体业务类,他实现了org.quartz.Job类的execute方法。这里面来完成具体的定时任务逻辑。
创建工具类
封装创建、更新、立即执行、暂停、恢复、删除定时任务的特定方法。具体如下:
已创建新的定时任务为例:
public static void createScheduleJob(Scheduler scheduler, ScheduleJob scheduleJob) throws BaseException {
try {
//构建job信息
JobDetail jobDetail = JobBuilder.newJob(ScheduleJobBean.class).withIdentity(getJobKey(scheduleJob.getJobId())).build();
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
.withMisfireHandlingInstructionDoNothing();
//按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getJobId())).withSchedule(scheduleBuilder).build();
//放入参数,运行时的方法可以获取
jobDetail.getJobDataMap().put(ScheduleJob.JOB_PARAM_KEY, scheduleJob);
scheduler.scheduleJob(jobDetail, trigger);
//暂停任务
if(scheduleJob.getStatus() == ScheduleStatus.PAUSE.getValue()){
pauseJob(scheduler, scheduleJob.getJobId());
}
} catch (SchedulerException e) {
logger.error("【创建定时任务异常】",e);
throw new BaseException("创建定时任务失败");
}
}
这里我们可以看到 CronScheduleBuilder 使我们在这自己通过参数构建出来的,完成实际的schedule调度任务。封装完成后,我们可以看如何调用来完成具体的任务执行。
具体调用逻辑代码如下:
scheduleJob.setStatus(ScheduleStatus.NORMAL.getValue());
if (scheduleJobMapper.insertSelective(scheduleJob) > 0) {
ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
return scheduleJob.getJobId();
}
此处显示将我们的具体的配指定人任务入库,后面执行我们自定义的新增定时任务功能来实现真正的执行定人逻辑。
好了,到这里我们的任务定时任务模块中的新增既完成了,后面的修改等等大同小异。
欢迎大家关注我的公众号《coder练习生》