springboot(三)---定时任务

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值