jforum中使用Timer类定时监控配置文件是否发生了变化,如果发生了变化,则重新load一次配置文件。其中涉及到Timer类的使用,现将文件监控的代码从原项目中分离出来,供学习、参考只用。
1、工具类
package util;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
/**文件监控工具类**/
public class FileMonitor {
/**定时器**/
private Timer timer;
/**以文件名称为key,TimerTask为value**/
private Map timerEntries;
private static final FileMonitor instance = new FileMonitor();
private FileMonitor() {
this.timerEntries = new HashMap();
/**将先关的线程设置为非守护线程执行,否则程序会直接结束。
* JRE判断程序是否执行结束的标准是所有的前台线程执行完毕了,而不管后台线程的状态。
* jforum中设置为true,做为守护线程执行。但如果单独调用,必须设置为false,否则run方法不会执行。**/
this.timer = new Timer(false);
}
public static FileMonitor getInstance() {
return instance;
}
/**
* Add a file to the monitor
*
* @param listener
* The file listener
* @param filename
* The filename to watch
* @param period
* The watch interval.
*/
@SuppressWarnings("unchecked")
public void addFileChangeListener(FileChangeListener listener,
String filename, long period) {
/**将之前的监控取消掉**/
this.removeFileChangeListener(filename);
System.out.println("watch file---"+filename);
FileMonitorTask task = new FileMonitorTask(listener, filename);
this.timerEntries.put(filename, task);
/**计划任务,每隔一段时间检查文件的最后更新日期**/
this.timer.schedule(task, period, period);
}
/**
* Stop watching a file
*
* @param listener
* The file listener
* @param filename
* The filename to keep watch
*/
public void removeFileChangeListener(String filename) {
FileMonitorTask task = (FileMonitorTask) this.timerEntries.remove(filename);
if (task != null) {
task.cancel();
}
}
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() {
System.out.println("run()...........");
/**表示文件最后一次被修改的时间的 long 值,
* 用该时间与历元(1970 年 1 月 1 日,00:00:00 GMT)的时间差来计算此值(以毫秒为单位)。**/
long latestChange = this.monitoredFile.lastModified();
// 如果日期发生变化,发生通知。
if (this.lastModified != latestChange) {
this.lastModified = latestChange;
this.listener.fileChanged(this.filename);
}
}
}
}
2、文件监听接口,定义一个文件监听的接口
package util;
public interface FileChangeListener
{
/**
* Invoked when a file changes
*
* @param filename Name of the changed file
* 定义一个接口,用来接受当文件发生更新时文件监视器FileMonitor发出的通知,并采取相应措施。
*/
public void fileChanged(String filename);
}
package util;
/*当全局属性文件SystemGlobals.properties发生变化时,重新加载。*/
public class SystemGlobalsListener implements FileChangeListener {
public void fileChanged(String filename) {
System.out.println("SystemGlobalsListener reload file");
}
}
测试代码
package test;
import java.io.FileInputStream;
import java.util.Properties;
import org.junit.BeforeClass;
import org.junit.Test;
import util.FileMonitor;
import util.SystemGlobalsListener;
public class TestListenForFile {
public static int fileChangesDelay;
@BeforeClass
public static void LoadFile() throws Exception{
FileInputStream fis = null;
Properties p = new Properties();
fis = new FileInputStream("your file path");
p.load(fis);
/**定时扫描文件的时间间隔**/
fileChangesDelay = Integer.parseInt((String)p.get("file.changes.delay"));
}
@Test
public static void testFileMonitor(){
if(fileChangesDelay > 0){
FileMonitor.getInstance().addFileChangeListener(new SystemGlobalsListener(),
"your file path",fileChangesDelay);
}
}
线程启动后,每隔一定时间自动检查文件的变更情况,在此过程中,修改文件,监听程序检查到文件最后一次修改的时间和之前的不一致时,会重新加载文件,打印日志如下:
run()...........
run()...........
run()...........
run()...........
run()...........
run()...........
SystemGlobalsListener reload file
run()...........
run()...........
run()...........
run()...........
分享到:
相关推荐
这个压缩包文件包含了关于Jforum的多个重要知识点,包括配置、初始化流程、处理请求的MVC架构、数据库访问实现、文件监控、缓存机制以及权限控制等内容。下面将对这些主题进行详细阐述。 首先,Jforum的配置是论坛...
在MyEclipse中,你需要配置Jforum的数据库连接参数,通常是在`config.properties`文件中设置。 4. **部署与运行**:在MyEclipse中配置服务器(如Tomcat或Jetty),然后将Jforum项目部署到服务器上。运行服务器,...
- jForum提供了CSS定制功能,可以通过修改相应CSS文件来调整界面样式; - 也可以通过编写HTML模板文件来自定义布局结构。 3. **如何增加新功能?** - 对于简单需求可以直接利用现有的API接口进行二次开发; - ...
文件名称列表中的"jforum-2.1.9"表示这是JForum的2.1.9版本。每个版本都会包含一系列的改进和修复,确保系统的稳定性和安全性。在部署JForum时,我们需要下载对应的版本,并按照官方文档的指导进行安装和配置。 ...
`jforum_ns.bak`是数据库备份文件,可以还原到SQL SERVER 2008中,观察论坛的表结构、索引和数据关系。 其次,关于SQL SERVER 2008的使用,以下几点值得注意: 1. **数据库恢复**:`jforum_ns.bak`文件可以通过SQL...
Java论坛系统 JForum.zip Java调用本地库 JNAerator.zip Java远程终端工具 JTA.rar Java邮件服务器 James.rar Java邮件检验库 JEmval.zip Java验证码生成库 JCaptcha.rar JAXP数据验证引擎 Serene.zip JBoss...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
其目标明确而远大——打造一款能够替代现有商业课程管理系统的通用平台,旨在促进教学、学习以及学术研究中的协作与创新。Sakai不仅支持全面或部分在线的学习环境,还具备高度的灵活性和可定制性,能够适应不同教育...