扣扣技术分享交流群:1125844267
说明:参考自一篇博客,没有保存具体链接
1、首先是一个工具类,具体对定时任务实施启动、取消和修改操作
public class ScheduleUtil {
private static ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
private static Map<String, ScheduledFuture<?>> scheduledFutureMap = new HashMap<>();
static {
threadPoolTaskScheduler.initialize();
}
/**
* 启动
* @param scheduleTask 定时任务
* @param corn 执行时间表达式
*/
public static boolean start(ScheduleTask scheduleTask, String corn) {
ScheduledFuture<?> scheduledFuture = threadPoolTaskScheduler
.schedule(scheduleTask, new CronTrigger(corn));
scheduledFutureMap.put(scheduleTask.getId(), scheduledFuture);
return true;
}
/**
* 取消
*
* @param scheduleTask 定时任务
*/
public static boolean cancel(ScheduleTask scheduleTask) {
ScheduledFuture<?> scheduledFuture = scheduledFutureMap.get(scheduleTask.getId());
if (scheduledFuture != null && !scheduledFuture.isCancelled()) {
scheduledFuture.cancel(false);
}
scheduledFutureMap.remove(scheduleTask.getId());
return true;
}
/**
* 修改
* @param scheduleTask 定时任务
* @param corn 执行时间表达式
*/
public static boolean reset(ScheduleTask scheduleTask, String corn) {
//先取消定时任务
cancel(scheduleTask);
//然后启动新的定时任务
start(scheduleTask, corn);
return true;
}
}
2、定时任务线程类。id是对不同任务的一个标识,service是要定时任务具体执行的操作,这里可以根据自己的业务需求写,我这里是定时清理数据,所以命名CleanTaskService,至于第三个参数,可有可无。
public class ScheduleTask implements Runnable {
private String id;
private CleanTaskService service;
private int cleanTime;
public String getId() {
return id;
}
/**
* @param id 任务ID
* @param service 业务类
* @param cleanTime 清理几个月之前的数据
*/
public ScheduleTask(String id, CleanTaskService service, int cleanTime) {
this.id = id;
this.service = service;
this.cleanTime = cleanTime;
}
@Override
public void run() {
service.work(cleanTime);
}
}
3、项目启动时,从数据库查询出定时任务数据,开启定时任务
@Override
public void run(ApplicationArguments args) throws Exception {
logger.info("初始化清理缓冲定时器===========================");
CacheDir cacheDir = cacheDirMapper.getCacheDirMessage();
ScheduleUtil.start(new ScheduleTask(cacheDir.getId().toString(), cleanTaskService, cacheDir.getCleanTime()), cacheDir.getCron());
}
4、修改定时任务时间,直接传入cron表达式
//重行定义定时器
ScheduleUtil.reset(new ScheduleTask(cacheDir.getId().toString(), cleanTaskService, cacheDir.getCleanTime()), cacheDir.getCron());
//修改数据库定时任务信息
cacheDirService.updateCacheDirMessage(cacheDir);