`
Copperfield
  • 浏览: 260177 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:25137
社区版块
存档分类

jforum中的文件监控

 
阅读更多

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相关文档和PPT

    这个压缩包文件包含了关于Jforum的多个重要知识点,包括配置、初始化流程、处理请求的MVC架构、数据库访问实现、文件监控、缓存机制以及权限控制等内容。下面将对这些主题进行详细阐述。 首先,Jforum的配置是论坛...

    Jforum2.19

    在MyEclipse中,你需要配置Jforum的数据库连接参数,通常是在`config.properties`文件中设置。 4. **部署与运行**:在MyEclipse中配置服务器(如Tomcat或Jetty),然后将Jforum项目部署到服务器上。运行服务器,...

    jforum开源的论坛文档

    - jForum提供了CSS定制功能,可以通过修改相应CSS文件来调整界面样式; - 也可以通过编写HTML模板文件来自定义布局结构。 3. **如何增加新功能?** - 对于简单需求可以直接利用现有的API接口进行二次开发; - ...

    jforum博客

    文件名称列表中的"jforum-2.1.9"表示这是JForum的2.1.9版本。每个版本都会包含一系列的改进和修复,确保系统的稳定性和安全性。在部署JForum时,我们需要下载对应的版本,并按照官方文档的指导进行安装和配置。 ...

    jforum2.1.9代码及SQL SERVER数据库备份

    `jforum_ns.bak`是数据库备份文件,可以还原到SQL SERVER 2008中,观察论坛的表结构、索引和数据关系。 其次,关于SQL SERVER 2008的使用,以下几点值得注意: 1. **数据库恢复**:`jforum_ns.bak`文件可以通过SQL...

    Java项目源码经典实用——提高必备【必学必看】

    Java论坛系统 JForum.zip Java调用本地库 JNAerator.zip Java远程终端工具 JTA.rar Java邮件服务器 James.rar Java邮件检验库 JEmval.zip Java验证码生成库 JCaptcha.rar JAXP数据验证引擎 Serene.zip JBoss...

    JAVA上百实例源码以及开源项目源代码

    Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...

    java开源包1

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包11

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包2

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包3

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包6

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包5

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包10

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包4

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包8

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包7

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包9

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包101

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    Java资源包01

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

Global site tag (gtag.js) - Google Analytics