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

时间:2015-01-02 19:46:03

标签: scala jetty scalatra

如果初始化失败,我希望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

由于

1 个答案:

答案 0 :(得分:2)

简短的回答是否定的。

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

这有两个原因;

首先 - 引导程序旨在引导多个servlet,如果一个servlet失败,预期的条件是其余的仍然出现。

第二 - 即使你只站起来一个servlet,你的关闭代码没有被调用的原因实际上是在servlet规范中定义的;

  

2.3.2.1初始化时的错误条件

     

在初始化期间,servlet实例可以抛出一个   UnavailableException或ServletException。在这种情况下,servlet   不得进入现役,必须由   servlet容器。 destroy方法不是按原样调用的   认为初始化不成功。