您的位置:首页 > 编程语言 > Java开发

java动态加载配置文件

2013-07-17 22:57 411 查看
最近项目中需要做定时任务,即定时数据库的备份。定时时间用户可以在界面中配置,要求配置修改好立即生效。

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

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

}

}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: