我想重新启动一个servlet(在web.xml中,当JBoss运行时声明)只是因为它的init-param指向一个内容已经改变的文件(即下面的providers.fac已被修改)。
如果有办法重新加载init-param而不重新启动servlet,它也会很好。
我想我可以修改servlet来添加请求参数和函数来重启自己? 还有其他选择吗?
<servlet>
<servlet-name>coverage</servlet-name>
<servlet-class>coverageServlet</servlet-class>
<init-param>
<param-name>ConfigUrl</param-name>
<param-value>file:///C:/coverage/providers.fac</param-value>
</init-param>
<init-param>
<param-name>CacheDir</param-name>
<param-value>coverage</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
环境: Servlet Api 2.4 JBoss 4.2 Spring Framework 2.5
答案 0 :(得分:1)
如果你在jboss中,你可以通过改变web.xml文件来重启servlet,如果你的servlet被爆炸了。在Linux上,触摸可以做到。
不确定您的配置文件是什么格式,但如果您尝试自动重新加载属性配置文件,我将查看支持此开箱即用的公共配置库(FileChangedReloadingStrategy)
答案 1 :(得分:1)
如果您计划在一天/一周内自动重启servlet多次,则应确保您的permgen足以处理servlet重新加载。有些情况下我在生产中完成了这项工作,并且因为很多PermGen错误而烧毁了自己。
答案 2 :(得分:0)
2个选项:
在doGet()
或doPost()
上添加额外检查,当管理员用户登录时,如果设置了某个请求参数,则会重新加载该文件并提供调用该请求的管理屏幕
重写servlet(或将部件重构为ServletContextListener
)以将其存储在ServletContext
中,而不是作为servlet的实例变量存储,并有一些管理屏幕,用于重新加载ServletContext
中的文件{1}}。
答案 3 :(得分:0)
我会通过将文件管理从servlet中拉出并将其放入JBoss JMX ServiceMBean来分离这些问题。 MBean可以在必要时负责监视文件的更改和重新加载,并且还可以向调用的servlet公开所需的操作。这将允许您不必重新加载和重新初始化相当重量级操作的servlet(或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 */
}
}
您的servlet可能如下所示:
// 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 ,否则该文件应该是线程安全的。
我意识到这看起来有点过度设计,但你真的应该将servlet的功能与管理文件的功能分开。