我有一个应用程序在tomcat6中运行,它在启动时读取资源文件(简单文本文件,无xml)以配置/实例化一些类。现在我希望能够修改该文件并将更改反映到应用程序中,而无需重新启动服务器。有没有办法做到这一点?更改应用程序配置/资源文件的监听器
基本上,如果我可以定义并附加一个侦听器到该资源,那就是我所需要的。
我有一个应用程序在tomcat6中运行,它在启动时读取资源文件(简单文本文件,无xml)以配置/实例化一些类。现在我希望能够修改该文件并将更改反映到应用程序中,而无需重新启动服务器。有没有办法做到这一点?更改应用程序配置/资源文件的监听器
基本上,如果我可以定义并附加一个侦听器到该资源,那就是我所需要的。
通过编程可以trgger一个服务,将刷新这些类与新文件
不知道是否有一个内置的资源监听器,但它是相当简单的,开始一个新的线程,监视文件中的文件系统(例如上次更新的日期/时间),如果更改了类,则刷新它们。
开始在网络应用程序,它得到如下资源文件的计时器:
在ServletContextListener.contextInitialized(),
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();
}
}
}
}
上面的代码只是一个模板
你应该比'TimerTask'更喜欢'ScheduledExecutorService'。另见http://stackoverflow.com/questions/409932/java-timer-vs-executorservice和http://stackoverflow.com/questions/5798688/reload-servlet-once-a-month。或者当您在具有EJB容器的Java EE 6上时,更喜欢'@ Singleton'和'@ Schedule'。另见http://stackoverflow.com/questions/5357033/background-timer-task-in-jsp-web-application。 – BalusC 2011-06-02 14:33:54