Я бы отделил эти проблемы, вытянув управление файлами из сервлета и поместив его в JBoss JMX ServiceMBean.MBean может следить за изменениями в файле и при необходимости перезагружать его, а также может предоставлять необходимые операции [вызывающему сервлету].Это позволит вам не перезагружать и повторно запускать сервлет (или WAR), которые являются довольно тяжеловесными операциями.
Я придумаю пару операций для FileManager:
public interface FileManagerMBean extends org.jboss.system.ServiceMBean {
public void setFileName(String fileName);
public void setCheckFrequency(long freq);
public String getCoverageData(......);
public String getProviderData(......);
}
Реализация может быть (в том же пакете, пожалуйста :))
public class FileManager extends org.jboss.system.ServiceMBeanSupport implements FileManagerMBean {
public void setFileName(String fileName) { .... }
public void setCheckFrequency(long freq) { .... }
public String getCoverageData(......) { /* impl */ }
public String getProviderData(......) { /* impl */ }
public void startService() throws Exception {
/* Start a file watcher thread */
}
public void stopService() throws Exception {
/* Stop the file watcher thread */
}
}
Ваш сервлет может выглядеть так:
// A ref to the MBean
FileManagerMBean fileMgr = null;
// The JMX MBean's ObjectName
ObjectName fileMgrOn = org.jboss.mx.util.ObjectNameFactory.create("portoalet.com:service=FileManager");
public void init() {
// Get the JBoss MBeanServer
MBeanServer server = org.jboss.mx.util.MBeanServerLocator.locateJBoss();
// Create an MBeanInvoker for the service
fileMgr = (FileManagerMBean)javax.management.MBeanServerInvocationHandler.newProxyInstance(server, fileMgrOn,FileManagerMBean.class, false);
}
Теперь вы можете использовать fileMgr экземпляр для вызова вашего FileManager MBean, который должен быть потокобезопасным, если вы не синхронизируете доступ к fileMgr .
Я понимаю, что это выглядит немного перегруженным, но вам действительно следует отделитьфункции сервлета из функций управления файлом.