重新启动/重新启动servlet

时间:2011-05-16 06:31:17

标签: servlets jboss restart

我想重新启动一个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

4 个答案:

答案 0 :(得分:1)

如果你在jboss中,你可以通过改变web.xml文件来重启servlet,如果你的servlet被爆炸了。在Linux上,触摸可以做到。

不确定您的配置文件是什么格式,但如果您尝试自动重新加载属性配置文件,我将查看支持此开箱即用的公共配置库(FileChangedReloadingStrategy

答案 1 :(得分:1)

如果您计划在一天/一周内自动重启servlet多次,则应确保您的permgen足以处理servlet重新加载。有些情况下我在生产中完成了这项工作,并且因为很多PermGen错误而烧毁了自己。

答案 2 :(得分:0)

2个选项:

  1. doGet()doPost()上添加额外检查,当管理员用户登录时,如果设置了某个请求参数,则会重新加载该文件并提供调用该请求的管理屏幕

  2. 重写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的功能与管理文件的功能分开。