我正在使用 Jetty 服务器,我想在服务器启动时进行一次检查。 为此我创建了一个监听器类,并将其条目放在web.xml中,如下所示:
听众类:
public class LicenseCheck extends ContextLoaderListener
{
private static final Logger log = Logger.getLogger(LicenseCheck.class);
public LicenseCheck()
{
log.info("Checking license");
}
}
Web.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- spring context listener -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.license.LicenseCheck</listener-class>
</listener>
<!-- Index pages -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
但是在添加这个之后,我的应用程序无法启动并抛出异常:
HTTP错误:503
访问/的问题。原因是:
Service Unavailable
由Jetty提供://
如果我从web.xml中删除了监听器的条目,它可以正常工作。
请为此提供解决方案。
答案 0 :(得分:0)
我从日志中获得了解决方案:
日志说:
2014-04-03 18:50:41.969:WARN ::上下文启动失败 org.mortbay.jetty.webapp.WebAppContext@58afc4dd {/ SpringMVCRest,d:\工作区\ SpringMVCRest \的WebContent} java.lang.IllegalStateException:无法初始化上下文,因为 已存在根应用程序上下文 - 检查是否 您的web.xml中有多个ContextLoader *定义!在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:265) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) 在 org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:549) at org.mortbay.jetty.servlet.Context.startContext(Context.java:136) 在 org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282) 在 org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518) 在 org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499) 在 org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 在 org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) 在org.mortbay.jetty.Server.doStart(Server.java:224)at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) 在runjettyrun.Bootstrap.main(Bootstrap.java:97)2014-04-03 18:50:42.047:INFO ::已启动SelectChannelConnector@0.0.0.0:8080
所以我找到了2个解决方案:
两者都适合我。
答案 1 :(得分:0)
按照您在web.xml中指定的顺序调用侦听器。
<listener>
<listener-class>com.license.LicenseCheck</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
public class LicenseCheck implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
/* This method is called when the servlet context is
initialized(web app is deployed/started).
You can initialize servlet context related data here.
*/
//Write your logic to check license expiry
}
public void contextDestroyed(ServletContextEvent event) {
/* This method is invoked when the servlet context ( web app) is undeployed or server shuts down.
*/
//Do nothing
}
}
这样,即使在ContextLoaderListener加载applicationContext之前,LicenseCheck也会首先执行并检查到期日期。