Java EE应用程序启动失败

时间:2011-08-12 16:46:38

标签: java-ee servlets startup ejb-3.1

如果在应用程序初始化期间发生异常,是否有任何方法可以阻止Java EE应用程序启动?我基本上正在寻找一种方法,使应用程序在JSR-77ServletContextListener抛出未处理的异常后进入“j2ee.state.failed”状态(每Singleton)应用程序初始化期间Startup bean。

EJB specification似乎表明如果在初始化Singleton bean期间发生异常,应用程序将继续启动并运行而不会出现错误;但是,只有bean本身可能处于无法调用的状态。不幸的是,这不是我正在寻找的行为。

  

4.8.4单例错误处理

     

在Singleton初始化期间发生的错误被认为是致命的,必须导致丢弃Singleton实例。可能的初始化错误包括注入失败,从PostConstruct方法抛出的系统异常,或PostConstruct方法容器管理的事务成功提交失败。如果单例无法初始化,则对Singleton的尝试调用会导致第3.4.3节和第3.4.4节中定义的异常。

Servlet specification的要求有点模棱两可,似乎不是要求容器以任何特定方式运行,而只是建议(通过使用术语“可能”)Web模块继续启动,但任何请求都应导致内部服务器错误。再说一次,遗憾的是这不是我正在寻找的行为。如果Web应用程序无法处理任何请求,为什么应该继续启动并且似乎正在运行?

  

11.6听众例外

     

容器可以使用HTTP状态代码500响应对Web应用程序的所有后续请求,以指示应用程序错误。

根据我的经验,我看到应用程序服务器以不同的方式处理此要求。实际上,某些容器会阻止应用程序在这些情况下启动,而其他容器只会抑制异常并响应500错误的请求,如规范中所示。

如果在初始化期间发生异常,我是否会忽略规范中阻止应用程序启动的任何部分?

3 个答案:

答案 0 :(得分:2)

我认为这取决于您使用的应用服务器。正如您所提到的,如何处理无效状态的部署取决于他。部署失败时不会处于活动状态,因此您必须提供一项服务,以查找部署在成功启动时应提供的提示。如果没有,您可以通知管理员。但这是所有特定于服务器的或需要外部工具。

在某些项目中,我们使用[nagios] [1]和[rhq] [2]来检查部署。例如,nagios在JBossAS上检查jmx-console以进行所需的部署。如果部署的应用程序在部署后几秒钟内未显示,则会通知其工作人员。

答案 1 :(得分:1)

+1来meme回答。也许它可能会有所帮助:在我的expirience组合中,如果注释@Startup和@Singleton的bean在@PostConstruct方法中抛出异常,它会阻止整个应用程序(ear)在JBoss AS 7.1.1上启动

答案 2 :(得分:0)

在网络应用程序的情况下 - 为什么不创建一个servlet过滤器,它将检查你自己的“失败”标志,并返回500任何请求,如果这个标志被提出?从容器的角度来看,您的应用程序当然会启动。