前言
使用Quartz实现了可配置定时任务,将定时任务Quartz写入数据库中。现在想随着项目启动能够自动触发定时任务,下面是实现方法:
项目自启动
Spring Boot使用ApplicationRunner实现项目启动之后直接执行业务操作
这篇博客详细描述了项目启动后自动执行业务操作的实现。我们只需要在run方法里面添加定时任务调用的方法接口。
log.info("启动定时任务");
quartzService.startQuartz();
定时任务启动
从数据库获取定时任务信息
public void startQuartz(){
String jobGroup ="MySyncTask";
String jobName ="定时人数";
try {
//先已有的任务
List<Quartz> list = quartzMapper.findList(jobGroup, jobName);
if(list != null && list.size()>0){
log.info("项目启动后,启动定时任务:{}",list.get(0).getJobName());
doQuatrz(list.get(0));
}
}catch (Exception e){
e.printStackTrace();
log.error("项目启动后,启动定时任务发生异常:{}",e.getMessage());
API.e("项目启动后,启动定时任务发生异常");
}
}
定时任务查询和触发
private void doQuatrz(Quartz quartz){
try {
//直接启动
Class cls = Class.forName(quartz.getJobClassName()) ;
cls.newInstance();
//构建job信息
JobDetail job = JobBuilder.newJob(cls).withIdentity(quartz.getJobName(),quartz.getJobGroup()).withDescription(quartz.getDescription()).build();
// 触发时间点
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartz.getCronExpression());
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger_"+quartz.getJobName(), quartz.getJobGroup()).withDescription(quartz.getDescription()).startNow().withSchedule(cronScheduleBuilder).build();
//交由Scheduler安排触发
scheduler.scheduleJob(job, trigger);
quartz.setJobStatus(JobStatus.RUN.getStatus());
quartzRepository.save(quartz);
}catch (Exception e){
e.printStackTrace();
log.error("执行任务发生异常:{}",e.getMessage());
API.e("执行任务发生异常");
}
}