java - 有没有办法知道 ServletContextListener 中 Web 应用程序发生了什么变化?

标签 java tomcat jakarta-ee servletcontextlistener

有没有办法知道,在 ServletContextListener 中,Web 应用程序中的哪个文件已更改导致上下文重新加载? 它是一个 JSP 文件吗?我可以找出更改了哪个 .class 文件吗?

最佳答案

你可以实现一个文件更改监听器,

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 我会尽快更新。

关于java - 有没有办法知道 ServletContextListener 中 Web 应用程序发生了什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45186081/

相关文章:

java - HQL:如何根据映射复合元素的属性对对象列表进行排序

java - Tomcat Servlet 安全性

java - 在 Ubuntu 上的 Eclipse 中设置 Tomcat

由于找不到类,spring 无法在 tomcat 中启动

Java .policy 文件 - 如何防止 java.util.Date() 被访问

java - Java 程序终止时未能关闭文件有什么危害吗?

java - 重载参数化测试运行器不与 JUnit4Provider 一起工作

eclipse - 构建路径 eclipse java j2ee

java - 如何向所有 Google App Engine 实例广播数据?

java - 将 Jetty 与 RESTEasy 集成