Servlets 重新启动/重新初始化servlet

Servlets 重新启动/重新初始化servlet,servlets,jboss,restart,Servlets,Jboss,Restart,我想重新启动一个servlet(当JBoss运行时,在web.xml中声明),因为它的init参数指向一个内容已更改的文件(即下面的providers.fac已被修改) 如果有一种方法可以在不重新启动servlet的情况下重新加载init参数,那也会很好 我想我可以修改servlet来添加一个请求参数和一个重新启动自身的函数? 还有其他选择吗 <servlet> <servlet-name>coverage</servlet-name> &l

我想重新启动一个servlet(当JBoss运行时,在web.xml中声明),因为它的init参数指向一个内容已更改的文件(即下面的providers.fac已被修改)

如果有一种方法可以在不重新启动servlet的情况下重新加载init参数,那也会很好

我想我可以修改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>

新闻报道
覆盖服务
配置URL
file:///C:/coverage/providers.fac
CacheDir
新闻报道
1.
环境: Servlet Api 2.4 JBoss4.2
SpringFramework2.5

如果您在jboss中,只要在servlet被分解时更改web.xml文件,就可以重新启动servlet。在linux上,触摸一下就可以了


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

如果您计划在一天/一周内多次自动重启servlet,您应该确保permgen足以处理servlet的重新加载。在生产过程中,我曾这样做过,并因许多PermGen错误而自焚。

2选项:

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

  • 重写servlet(或将部件重构为
    ServletContextListener
    ),将其存储在
    ServletContext
    中,而不是作为servlet的实例变量,并具有一些管理屏幕,在
    ServletContext
    中重新加载文件


  • 我将通过将文件管理从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(......);
    }
    
    实现可能是(请在同一个包中:)

    您的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的访问,否则该MBean应该是线程安全的


    我意识到这看起来有点过度设计,但您确实应该将servlet的功能与管理文件的功能分开。

    谢谢,我将尝试FileChangedLoadingStrategy,因为手动重新启动是不可接受的。您是只重新启动了一个servlet还是所有servlet?是的,我在手动重新部署*.war时看到一些PermGen错误times@portoalet它是一个servlet,但它是一个控制器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);    
    }