前言
定时任务是开发者在开发过程中所接触较多的事项之一,有些时候我们需要定时去做一件事情,如果周期不是很短,那么手动维护或许可以解决,如果周期很短,比如每隔5秒就要执行一次的时候,我们再去手动维护明显力不从心。对于某些用户而言,需要定时去访问一些数据,例如你是局域网用户,需要定时访问为你提供接口的数据,那么这个时候就需要用到定时器了。
本项目采用vue+SpringBoot前后端分离开发,当然可以在后续进行合并打包,或者部署为exe程序。我们这里不去讲如何部署,仅对代码进行讲解。
前端部分
这是页面展示,在这个页面可以对任务的执行类进行维护,同时也可以维护任务表达式。当然这个页面并不是重点,重点在后端。
后端部分
直接上代码,如果有不全的地方,在源码中都可以找到
@Service
public class HutoolTimerExeServiceImpl implements TimerExpService {
private static final Log log = Log.get();
@Override
public void startTimer(String taskId, String cron, String timerClass) {
if (ObjectUtil.hasEmpty(taskId, cron, timerClass)) {
System.out.println("请检查定时器的id,定时器cron表达式,定时任务是否为空!");
}
// 预加载类看是否存在此定时任务类
try {
Class.forName(timerClass);
} catch (ClassNotFoundException e) {
System.out.println("定时任务执行类不存在");
}
// 定义hutool的任务
Task task = () -> {
try {
TimerTaskRunner timerTaskRunner = (TimerTaskRunner) SpringUtil.getBean(Class.forName(timerClass));
timerTaskRunner.action();
} catch (ClassNotFoundException | IOException e) {
log.error(">>> 任务执行异常:{}", e.getMessage());
}
};
// 开始执行任务
CronUtil.schedule(taskId, cron, task);
}
@Override
public void stopTimer(String taskId) {
CronUtil.remove(taskId);
}
}
public class TimerTaskRunListener implements ApplicationListener<ApplicationStartedEvent>, Ordered {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
TimerService timerService = SpringUtil.getBean(TimerService.class);
TimerExpService timerExeService = SpringUtil.getBean(TimerExpService.class);
// 获取所有开启状态的任务
TimerParam timerParam = new TimerParam();
timerParam.setStat(TimerEnum.RUNNING.getCode());
List<Timer> list = timerService.list(timerParam);
// 添加定时任务到调度器
for (Timer timer : list) {
timerExeService.startTimer(String.valueOf(timer.getId()), timer.getCron(), timer.getTimerClass());
}
// 设置秒级别的启用
CronUtil.setMatchSecond(true);
// 启动定时器执行器
CronUtil.start();
}
@Override
public int getOrder() {
return LOWEST_PRECEDENCE;
}
}
需要注意的是,一定要在resources文件夹下,新建一个名称为META-INF的文件夹,并创建名称为spring.factories的文件,文件中这样写
org.springframework.context.ApplicationListener=\
com.example.config.TimerTaskRunListener
只有这样你的定时任务才会被发现。
源码地址
链接:https://pan.baidu.com/s/1QvBnBSogO72AwzFrIr6xIg
提取码:ABCD