Java 应用程序配置/资源文件更改的侦听器
我有一个运行在tomcat6中的应用程序,它在启动时读取一个资源文件(一个简单的文本文件,没有xml),以配置/实例化一些类。现在,我希望能够修改该文件以及应用程序中反映的更改,而无需重新启动服务器。有办法吗Java 应用程序配置/资源文件更改的侦听器,java,tomcat,servlets,Java,Tomcat,Servlets,我有一个运行在tomcat6中的应用程序,它在启动时读取一个资源文件(一个简单的文本文件,没有xml),以配置/实例化一些类。现在,我希望能够修改该文件以及应用程序中反映的更改,而无需重新启动服务器。有办法吗 基本上,如果我可以定义一个侦听器并将其附加到该资源,这就是我所需要的 通过编程,您可以尝试使用新文件刷新这些类的服务通过编程,您可以尝试使用新文件刷新这些类的服务不确定是否有内置的资源侦听器,但启动一个新线程来监视文件系统中的文件是相当简单的(例如上次更新的日期/时间)并在类发生更改时刷新
基本上,如果我可以定义一个侦听器并将其附加到该资源,这就是我所需要的 通过编程,您可以尝试使用新文件刷新这些类的服务通过编程,您可以尝试使用新文件刷新这些类的服务不确定是否有内置的资源侦听器,但启动一个新线程来监视文件系统中的文件是相当简单的(例如上次更新的日期/时间)并在类发生更改时刷新类。不确定是否有内置的资源侦听器,但启动一个监视文件系统中文件的新线程(例如上次更新的日期/时间)相当简单如果更改,则刷新类。在web应用程序中启动计时器,获取以下资源文件: 在ServletContextListener.contextInitialized()中
上面的代码只是一个模板在web应用程序中启动一个计时器,该计时器获取以下资源文件: 在ServletContextListener.contextInitialized()中
上述代码只是一个模板请尝试以下操作之一:
使用Java 7,将成为标准API的一部分。请尝试以下操作之一:
使用Java 7,将成为标准API的一部分。您应该更喜欢
ScheduledExecutorService
而不是TimerTask
。另请参阅和。或者,当您使用支持EJB的容器使用Java EE 6时,更喜欢@Singleton
和@ScheduledExecutorService
而不是imerTask
。另请参阅和。或者,当您使用支持EJB的容器的Java EE 6时,更喜欢使用@Singleton
和@Schedule
。另请参阅。
package com.servlets;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class WatcherListener
implements ServletContextListener
{
public void contextInitialized(ServletContextEvent event)
{
ServletContext servletContext = event.getServletContext();
Timer timer = new Timer("ResourceListener");
timer.schedule(new MyWatcherTask(servletContext), 15);
}
public void contextDestroyed(ServletContextEvent event)
{
}
private class MyWatcherTask extends TimerTask
{
private final ServletContext servletContext;
private long lastModifiedTime = -1;
public MyWatcherTask(ServletContext servletContext)
{
this.servletContext = servletContext;
}
public void run()
{
URL resource = null;
try {
resource = servletContext.getResource("resouceFileName");
File resourceFile = new File(resource.toString());
long current = resourceFile.lastModified();
if (current > lastModifiedTime) {
reloadReources();
}
lastModifiedTime = current;
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
}