2017-07-19 9 views
0

ServletContextListenerで、Webアプリケーションのどのファイルが変更され、コンテキストがリロードされたのかを知る方法はありますか? はJSPファイルですか?どのような.classファイルが変更されたのか知ることができますか?Webアプリケーションで何が変更されたかをServletContextListenerで知る方法はありますか?

+0

なぜですか?コンテナのログファイルから取得できない 'ServletContextListener'の中で何をするつもりですか? – EJP

+0

EJPですが、現在、contextDestroyedとcontextInitializedの両方で長い処理コードが実行されています。たとえば、JSPファイルが変更され、このコードがすべてのクラスに対して実行されている場合、このコードは実行する必要はありません。どのクラスが変更されたか知っていれば、それらのクラスに対してのみ行うことができます – inor

答えて

0

ファイル変更リスナーを実装することができ、

public class FileMonitor 
{ 
    private static Logger logger = Logger.getLogger(FileMonitor.class); 
    private static final FileMonitor instance = new FileMonitor(); 
    private Timer timer; 
    private Map timerEntries; 

private FileMonitor() { 
    this.timerEntries = new HashMap(); 
    this.timer = new Timer(true); 
} 

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. 
*/ 
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); 
} 

/** 
* 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() { 
     long latestChange = this.monitoredFile.lastModified(); 
     if (this.lastModified != latestChange) { 
      this.lastModified = latestChange; 

      this.listener.fileChanged(this.filename); 
     } 
    } 
    } 
} 

コードは私のものではないと私はできるだけ早く私が知るように更新されますATM著者を見つけることができません。

+0

つまり、コンテナが何をしているのかを複製して、オーバーヘッドを2倍にします。 – EJP

関連する問題