Springboot Schedule (定时任务)
需求背景:
项目需要在(2018-12-01 12:00:00 -2018-12-01 17:00:00)期间每一小时从引擎中拉取一次数据,且程序每隔五秒执行一次
技术背景:
在开始做需求前百度了一下,网上很多都是使用Quartz,感觉有点小题大作了,找到如下:
常用的几种定时任务框架做一个比较:
可以看出Spring Schedule 框架已经满足了我们的项目需求。
扩展一下:我们配置时间选用ini文件
ini文件优点:当我们的程序不需要任何配置时,这样程序就是对外全封闭的,一旦程序需要修改一些参数必须修改程序代码并且重新编译,这样容易程序出错,所以程序部署时增加文件配置,当修改参数时不需要重新修改代码即可修改参数,方便快捷安全。
ini文件格式:由节、键、值组成。
节
[section]
参数(键=值)
name=value
注解
注解使用分号表示(;)。在分号后面的文字,直到该行结尾都全部为注解。
参考
开始表演:
一、在启动类中加入@EnableScheduling注解
二、定时器配置(Cron表达式)
在application.properties中配置corn表达式
#scheduler配置
#cron参数:“秒 分 时 日 月 年”
#5秒
model.Btime.cron = */5 * * * * ?
三、编写定时任务类
@Component
public class Timedtask {
@Autowired
FileService fileService;
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Scheduled(cron = "${model.Btime.cron}")
public void reportCurrentTime() throws Exception {
System.out.println("系统时间:"+dateFormat.format(new Date()));
readIni();
ModelFileFilter modelFileFilter = new ModelFileFilter();
ResultData<BlockFileModel> query = fileService.query(modelFileFilter);
if(true){
writeIni();
}
System.out.println(JsonUtils.objectToJson(query));
}
private void readIni() throws Exception{
read("readIni");
}
private void writeIni() throws Exception {
read("read");
}
protected void read(String flag) throws Exception{
// 读取本次数据拉取的起始时间,再根据时间间隔计算出结束时间,构成一次时间段,拿到时间段去请求数据
IniFile iniFile = new BasicIniFile();
File file = new File("D:\\bluethink\\iworkspace\\onegis\\model.web\\src\\main\\resources\\time.ini");
IniFileReader reader = new IniFileReader(iniFile, file);
reader.read();
IniSection iniSection = iniFile.getSection("StartTime");
IniItem iniItem = iniSection.getItem("Stime");
String sTime = iniItem.getValue();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Long time = simpleDateFormat.parse(sTime).getTime();
IniSection iniS = iniFile.getSection("BetweenTime");
IniItem iniI = iniS.getItem("Btime");
Long btime = Long.valueOf(iniI.getValue())*1000;
Long time3 = time + btime;
Date date = new Date(time3);
String Etime = simpleDateFormat.format(date);
iniItem.setValue(Etime);
iniSection.addItem(iniItem);
iniFile.addSection(iniSection);
if (flag.equals("read")){
// 任务结束后,将最新的时间记录到ini文件里 ==》 startTime = endTime
IniFileWriter writer = new IniFileWriter(iniFile, file);
writer.write();
}
if (flag.equals("readIni")){
System.out.println("数据拉取开始时间"+sTime);
System.out.println("数据拉取"+btime/1000+"秒");
System.out.println("数据拉取结束时间:"+Etime);
}
}
四、执行程序
参考:https://www.cnblogs.com/skychenjiajun/p/9057379.html?utm_source=tuicool&utm_medium=referral