Servlets 重新启动/重新初始化servlet
我想重新启动一个servlet(当JBoss运行时,在web.xml中声明),因为它的init参数指向一个内容已更改的文件(即下面的providers.fac已被修改) 如果有一种方法可以在不重新启动servlet的情况下重新加载init参数,那也会很好 我想我可以修改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>
<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()
上添加一个额外检查,当管理员用户登录时设置了某个请求参数时,该检查将重新加载文件,并提供一个调用该请求的管理员屏幕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);
}