当前位置: 首页 > 工具软件 > FileMonitor > 使用案例 >

FileMonitor

姜旭
2023-12-01

最近在研究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);

        }

    }

 

全部逻辑也就完了。值得注意的是这里的监听器调用和监听器处理逻辑解耦了。

 类似资料:

相关阅读

相关文章

相关问答