我有一個應用程序在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