如果初始化失败,我希望Scalatra servlet退出,以便upstart / systemd /在失败时可以重新启动它。
从网上的示例中提取,我们有一个LifeCycle
做了一些初始化,但偶尔会失败
class Bootstrap extends LifeCycle {
override def init(context: ServletContext) {
throw new RunTimeException("foo")
}
}
我们的初始化过程非常典型
val server = new Server(port)
val context = new WebAppContext()
context setContextPath("/")
context.setResourceBase("src/lab/src/main/webapp")
context.setInitParameter(ScalatraListener.LifeCycleKey, "Bootstrap")
context.addEventListener(new ScalatraListener)
server.setHandler(context)
server.start
server.join
是否有办法让服务器在初始化异常时停止,而不在trystrap代码周围放置try块并手动调用stop
。
由于
答案 0 :(得分:2)
简短的回答是否定的。
稍微长一点的答案是你的LifeCycle(ScalatraBootstrap)init已经包含在try / catch块中,你可以在source for ScalatraListener中看到它。但它只是抛出异常。
这有两个原因;
首先 - 引导程序旨在引导多个servlet,如果一个servlet失败,预期的条件是其余的仍然出现。
第二 - 即使你只站起来一个servlet,你的关闭代码没有被调用的原因实际上是在servlet规范中定义的;
2.3.2.1初始化时的错误条件
在初始化期间,servlet实例可以抛出一个 UnavailableException或ServletException。在这种情况下,servlet 不得进入现役,必须由 servlet容器。 destroy方法不是按原样调用的 认为初始化不成功。