2011-08-12 152 views
14

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

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

4.8.4辛格尔顿错误处理辛格尔顿初始化期间发生

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

Servlet specification是在它的要求更加模糊一点,似乎不要求容器以任何特定方式来运转,而仅是暗示(通过使用术语“可以”),该幅材模块继续启动,但任何请求都应导致内部服务器错误。再次,这不幸的不是我正在寻找的行为。为什么Web应用程序如果无法处理任何请求,会继续启动并显示为正在运行?

11.6监听器异常

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

根据我的经验,我已经看到了应用服务器不同的方式处理这一要求。一些容器实际上会阻止应用程序在这些情况下启动,而其他容器只会抑制异常并按照规范中的建议回应500个错误的请求。

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

+0

+1;好问题。这也是我的经验 - 它们的做法有所不同...... – home

回答

0

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

+0

目标是阻止应用程序在无效状态下启动。 ServletContainerListeners和Singleton启动Bean通常用于执行应用程序运行所需的初始化;如果在初始化期间发生错误,理想状态将是快速失效。这可以防止用户检测到故障,并立即引起管理员的注意。它还将允许与应用程序无关的部署工具全面检测应用程序启动失败并相应地执行操作;例如,通过回滚应用程序更新。 – shelley

2

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

在一些项目中,我们使用[nagios] [1]和[rhq] [2]来检查部署。例如,nagios会在JBossAS上检查所需部署的jmx控制台。当部署的应用程序在部署后几秒钟内未显示时,通知其工作人员。

+0

Tomcat 7.x不会启动一个从'ServletContextListener.contextInitialized()'抛出未经检查的异常的应用程序,而WebLogic 12.1.3将启动该应用程序。 – javabrett

1

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

+2

同样在WebSphere Application Server 8.0+上。 –

相关问题