FileMonitor

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

        }

    }

 

全部邏輯也就完了。值得注意的是這裏的監聽器調用和監聽器處理邏輯解耦了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章