最近项目中需要做定时任务,即定时数据库的备份。定时时间用户可以在界面中配置,要求配置修改好立即生效。
想不到什么好办法。下面是一种实现思路
把用户配置的时间存到properties配置文件中,定时任务每隔一分钟执行一次,每次执行前都会去读取配置文件,如果配置的时间与当前时间一致,则执行任务,否则什么也不做。
之前做的时候,加载配置文件的方法如下
ClassLoader classLoader = this.getClass().getClassLoader();Properties prop = new Properties();prop.load(classLoader.getResourceAsStream("/dbbak.properties"));
发现修改了.properties后,即使重新执行,读入的仍为修改前的参数。
此问题的原因在于ClassLoader.getResourceAsStream读入后,会将.properties保存在缓存中,重新执行时会从缓存中读取,而不是再次读取.properties文件。
解决办法就是用如下方法
String fileStr = Thread.currentThread().getContextClassLoader().getResource("").toString();String file = fileStr.substring(5, fileStr.length())+ "Config.properties";InputStream in = new FileInputStream(new File(file));Properties prop = new Properties();prop.load(in);
下面是测试中完整代码
package org.lkm.db.time;
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Properties; import java.util.Timer; import java.util.TimerTask;
public class Dbbak {
public static void showTimer() throws Exception { TimerTask task = new TimerTask() { @Override public void run() { try { if(Dbbak.isRun()){ System.out.println("任务开始执行了"); }else{ //System.out.println("时间未到"); } } catch (Exception e) { e.printStackTrace(); } } }; String fileStr = Thread.currentThread().getContextClassLoader() .getResource("").toURI().getPath(); String file = fileStr+ "dbbak.properties"; InputStream in = new FileInputStream(new File(file)); Properties prop = new Properties(); prop.load(in); String time = prop.get("time").toString();
//设置执行时间 Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH);//每天 //定制每天的....执行, String t[] = time.split(":"); calendar.set(year, month, day, Integer.parseInt(t[0]), Integer.parseInt(t[1]), 00); Date date = calendar.getTime(); Timer timer = new Timer(); int period = 60 * 1000; //每天的date时刻执行task,每隔2秒重复执行 timer.schedule(task, date, period); }
public static void main(String[] args) throws Exception { new Dbbak().showTimer(); } public static boolean isRun() throws Exception{ String fileStr = Thread.currentThread().getContextClassLoader() .getResource("").toURI().getPath(); System.out.println(fileStr); String file = fileStr + "dbbak.properties"; InputStream in = new FileInputStream(new File(file)); Properties prop = new Properties(); prop.load(in); String time = prop.get("time").toString(); System.out.println(time); SimpleDateFormat sdf = new SimpleDateFormat("HH:mm-ss"); String str = sdf.format(new Date()); if(str.split("-")[0].equals(time)){ return true; } return false; }
}