java动态加载配置文件

最近项目中需要做定时任务,即定时数据库的备份。定时时间用户可以在界面中配置,要求配置修改好立即生效。

想不到什么好办法。下面是一种实现思路

把用户配置的时间存到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;           }

  }

原文地址:https://www.cnblogs.com/jiangu66/p/3199016.html