2.在application启动类添加开启定时任务的注解org.springframework.boot spring-boot-starter-quartz org.quartz-scheduler quartz 2.2.1 jar
;
private final ConcurrentHashMap cronTasks = new ConcurrentHashMap<>();
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//设定一个长度10的定时任务线程池,根据需要自己设置长度
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(500));
this.registrar = taskRegistrar;
}
@PreDestroy
public void destroy() {
this.registrar.destroy();
}
public void refreshTask( String cron, String taskId) {
if (StringUtils.isEmpty(cron)) {
return;
}
//判断同一任务id和cron表达式,不在重复执行
if (scheduledFutures.containsKey(taskId) && cronTasks.get(taskId).getExpression().equals(cron)) {
return;
}
//判断不同cron同一taskid,删除之前执行的任务,执行新的任务
if (scheduledFutures.containsKey(taskId)) {
scheduledFutures.get(taskId).cancel(false);
scheduledFutures.remove(taskId);
cronTasks.remove(taskId);
}
CronTask task = new CronTask(new Runnable() {
//此处可以定义一些线程里面使用的动态变量,方便run里面调用,每个线程之间是互不影响独立调用的
@Override
public void run() {
//执行业务逻辑
try {
//执行自己的定时任务,方法可以写出去
} catch (Exception e) {
log.info("执行任务异常,异常信息:" + e);
}
}
}, cron);
ScheduledFuture> future = registrar.getScheduler().schedule(task.getRunnable(), task.getTrigger());
cronTasks.put(taskId, task);
scheduledFutures.put(taskId, future);
}
public void deleteTask(String taskId) {
scheduledFutures.keySet().forEach(key -> {
if (Objects.equals(key, taskId)) {
scheduledFutures.get(key).cancel(false);
scheduledFutures.remove(key);
cronTasks.remove(key);
return;
}
});
}
}
4.调用就很方便,直接springboot实例化类对象调用方法就行了
@Autowired
ScheduleConfig scheduleConfig;
scheduleConfig.refreshTask('cron表达式','任务id');



