如果添加了 Context.setInitParameter 的 LifeCycle 抛出异常,则让 Scalatra 退出

Have Scalatra exit if LifeCycle added with Context.setInitParameter throws exception

我希望 Scalatra servlet 在初始化失败时退出,以便 upstart/systemd/whatever 可以在失败时重新启动它。

借鉴网上的例子,我们有一个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

有没有办法让服务器在初始化异常时停止,而无需在 bootstrap 代码周围放置 try 块并手动调用 stop

谢谢

简短的回答是否定的。

稍微长一点的答案是你的 LifeCycle (ScalatraBootstrap) init 已经包裹在一个 try/catch 块中,你可以在 source for ScalatraListener 中看到它。但它只是抛出一个异常。

这有两个原因;

第一 -- bootstrap 被设计为 bootstrap 多个 servlet,如果一个失败,预期的情况是其余仍然出现。

其次——即使您只建立一个 servlet,您的关闭代码未被调用的原因实际上在 servlet 规范中定义;

2.3.2.1 Error Conditions on Initialization

During initialization, the servlet instance can throw an UnavailableException or a ServletException. In this case, the servlet must not be placed into active service and must be released by the servlet container. The destroy method is not called as it is considered unsuccessful initialization.