Jakarta ee Java EE应用程序启动失败

Jakarta ee Java EE应用程序启动失败,jakarta-ee,servlets,startup,ejb-3.1,Jakarta Ee,Servlets,Startup,Ejb 3.1,如果在应用程序初始化过程中发生异常,是否有任何方法阻止JavaEE应用程序启动?我基本上是在寻找一种方法,使应用程序在应用程序初始化期间从一个或一个bean抛出一个未经处理的异常之后,进入一个“j2ee.state.failed”状态(per) 这似乎表明,如果在初始化Singletonbean期间发生异常,应用程序将继续启动并运行,不会出错;但是,只有bean本身可能处于无法调用的状态。不幸的是,这不是我想要的行为 4.8.4单例错误处理 在单例初始化期间发生的错误被认为是致命的,必须导致丢弃

如果在应用程序初始化过程中发生异常,是否有任何方法阻止JavaEE应用程序启动?我基本上是在寻找一种方法,使应用程序在应用程序初始化期间从一个或一个bean抛出一个未经处理的异常之后,进入一个“
j2ee.state.failed
”状态(per)

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

4.8.4单例错误处理

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

在其需求方面有点模棱两可,似乎不要求容器以任何特定方式运行,而只是建议(通过使用术语“可能”)web模块继续启动,但任何请求都应导致内部服务器错误。不幸的是,这不是我想要的行为。如果web应用程序无法处理任何请求,为什么它要继续启动并看起来正在运行

11.6侦听器异常

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

根据我的经验,我见过应用服务器以不同的方式处理这一需求。在这些情况下,一些容器实际上会阻止应用程序启动,而另一些容器只会抑制异常并响应500个错误的请求,正如规范中所建议的那样


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

对于web应用程序,为什么不创建一个servlet过滤器,它将检查您自己的“失败”标志,如果该标志被触发,则为任何请求返回500?从容器的角度来看,你的应用程序当然会启动

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


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

+1 to meme answer。也许这会有所帮助:在我的expirence组合中,如果带有注释@Startup和@Singleton的bean在@PostConstruct方法中抛出异常,它会阻止整个应用程序(ear)在JBoss 7.1.1上启动;好问题。这也是我的经验-他们的做法不同…目标是防止应用程序在无效状态下启动。ServletContainerListeners和Singleton启动bean通常用于执行应用程序正常运行所需的初始化;如果在此初始化过程中发生错误,理想状态将是快速失败。这可以防止用户检测故障,并立即引起管理员的注意。它还允许应用程序无关的部署工具普遍检测应用程序启动失败并相应地进行操作;例如,通过回滚应用程序更新。同样,在WebSphere application Server 8.0+上,Tomcat 7.x不会启动从
ServletContextListener.contextInitialized()
引发未检查异常的应用程序,而WebLogic 12.1.3将启动该应用程序。