如果在应用程序初始化期间发生异常,是否有任何方法可以阻止Java EE应用程序启动?我基本上正在寻找一种方法,使应用程序在JSR-77或ServletContextListener
抛出未处理的异常后进入“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错误的请求,如规范中所示。
如果在初始化期间发生异常,我是否会忽略规范中阻止应用程序启动的任何部分?
答案 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任何请求,如果这个标志被提出?从容器的角度来看,您的应用程序当然会启动。