最近在研究jforum,爲網站增加論壇,研究源碼看到了一些很好的東西,先分享一個自動加載配置文件的FileMonitor 。
FileMonitor 爲單態,添加文件改變監聽者。time對象爲jdk內置的定時器類。
/**
* Add a file to the monitor
*
* @param listener The file listener
* @param filename The filename to watch
* @param period The watch interval.
*/
public void addFileChangeListener(FileChangeListener listener,
String filename, long period) {
this.removeFileChangeListener(filename);
logger.info("Watching " + filename);
FileMonitorTask task = new FileMonitorTask(listener, filename);
this.timerEntries.put(filename, task);
this.timer.schedule(task, period, period);
}
FileMonitorTask爲內部靜態類,繼承了TimerTask,內部保存文件改變監聽者實例,和文件名,文件對象,文件最後修改時間等屬性。構造方法初始化屬性,在其run方法中,根據最後修改時間來調用監聽器的fileChange方法。
private static class FileMonitorTask extends TimerTask {
private FileChangeListener listener;
private String filename;
private File monitoredFile;
private long lastModified;
public FileMonitorTask(FileChangeListener listener, String filename) {
this.listener = listener;
this.filename = filename;
this.monitoredFile = new File(filename);
if (!this.monitoredFile.exists()) {
return;
}
this.lastModified = this.monitoredFile.lastModified();
}
public void run() {
long latestChange = this.monitoredFile.lastModified();
if (this.lastModified != latestChange) {
this.lastModified = latestChange;
this.listener.fileChanged(this.filename);
}
}
}
在監聽器的fileChanged方法中,重新加載配置文件。也稱爲具體的監聽處理邏輯。
public void fileChanged(String filename)
{
logger.info("Reloading "+ filename);
SystemGlobals.loadQueries(filename);
String driverQueries = SystemGlobals.getValue(ConfigKeys.SQL_QUERIES_DRIVER);
// Force reload of driver specific queries
if (!filename.equals(driverQueries)) {
SystemGlobals.loadQueries(driverQueries);
}
}
全部邏輯也就完了。值得注意的是這裏的監聽器調用和監聽器處理邏輯解耦了。