我们在ROOT.war
中使用带有web-xml的单个应用程序使用Jetty 9.3:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<listener>
<listener-class>path.AppEventListener</listener-class>
</listener>
<servlet>
<servlet-name>MyService</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- ***NOTE*** added next line per minus's answer -->
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>path.MyService</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyService</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
如果MyService
应用程序无法在启动时正确初始化,我们希望Jetty立即关闭,但我们似乎无法弄清楚如何执行此操作。 This question听起来可能相关,但似乎并没有在我们手中做出任何改变,可能是因为我们使用ant
而不使用ivy
作为构建工具。
我们目前看到的(不受欢迎的)行为是Jetty在需要之前没有尝试初始化应用程序,然后抛出异常。
根据减号答案进行更新
注意我根据上述答案更新了web.xml
我按照this question:
jetty-env.xml
文件
$ jar tf webapps/ROOT.war | grep -v lib | grep -v class
META-INF/
META-INF/MANIFEST.MF
WEB-INF/
WEB-INF/web.xml
WEB-INF/jetty-env.xml
$ jar xf webapps/ROOT.war WEB-INF/jetty-env.xml
$ cat WEB-INF/jetty-env.xml
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="throwUnavailableOnStartupException">true</Set>
</Configure>
注意我还更新了Jetty 9.3的DOCTYPE行。
此时应用程序立即启动并抛出错误,但Jetty保持运行状态。我在日志中看到以下内容:
2017-03-13 18:36:59.597:WARN:ROOT:main: unavailable
2017-03-13 18:36:59.599:WARN:oejw.WebAppContext:main: Failed startup of context o.e.j.w.WebAppContext@6767c1fc{/,file:///tmp/jetty-0.0.0.0-20002-ROOT.war-_-any-593353947747896998.dir/webapp/,UNAVAILABLE}{/ROOT.war}
答案 0 :(得分:2)
首先,您应该在servlet上设置<load-on-startup>1</load-on-startup>
。
<servlet>
<servlet-name>MyService</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>path.MyService</param-value>
</init-param>
</servlet>
首先加载这个servlet,然后停止服务器,你可以阅读Jetty: Detect if Webapp failed to start。
从应用程序中关闭服务器有点粗糙,我会启动一个调用关闭脚本的进程(失败时)。
我会提供(作为服务器的管理员)适当的关闭脚本(例如stop.jar)。
这样,您可以根据需要(通过提供脚本)关闭服务器,或者通过不提供故障来忽略故障,从而在管理员端保持对服务器状态的控制,而不是将此责任赋予应用程序。