SpringBoot 创建定时任务(配合数据库动态执行)
序言:创建定时任务非常简单,主要有两种创建方式:一、基于注解(@Scheduled) 二、基于接口(SchedulingConfigurer). 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就大派用场了。
一、静态定时任务(基于注解)
@Scheduled 除了支持灵活的参数表达式cron之外,还支持简单的延时操作,例如 fixedDelay ,fixedRate 填写相应的毫秒数即可。
@Scheduled(cron = "0/1 * * * * ? ")
使用Scheduled 确实很方便,但缺点是当我们调整了执行周期的时候,需要重启应用才能生效,这多少有些不方便。为了达到实时生效的效果,可以使用接口来完成定时任务。
一、动态定时任务(基于接口)
多看网上都是创建数据库,然后去查询时间再实现接口SchedulingConfigurer,但这些要在下次定时器执行的时候才会去读取数据库
我也是在这里收到启发
我在数据库查询到需要定时的时间字段,方法上是每秒执行一次,但是我再用线程睡眠需要停留的时间段,是不是就可以实现了!
@Scheduled(cron = "0/1 * * * * ? ")
public void addController() throws Exception {
if (Constant.status == 0) {
Matcher turn_time = p.matcher(MapperUtil.selectReactKeyValue("turn_time"));
if (!turn_time.find()) {
Constant.turnTime = 30;
logger.info("102M轮询间隔时间配置错误,默认改为30秒");
} else {
Constant.turnTime = Integer.valueOf(MapperUtil.selectReactKeyValue("turn_time"));
logger.info("轮询时间成功配置为" + Constant.turnTime);
}
}
//轮询十秒
Thread.sleep(Constant.turnTime * 1000);
//业务需要
R r = stationInfoService.selectStationInfoList();
List<ChannelInfo> stationInfoList = (List<ChannelInfo>) r.get("data");
if ((Integer) r.get("code") != 0 || stationInfoList.size() == 0) {
return;
}
for (int i = 0; i < stationInfoList.size(); i++) {
//
}
}
//轮询十秒
Thread.sleep(Constant.turnTime * 1000);
想法不成熟,望各位指点,哈哈哈