防止Java EE应用程序在异常时启动WebSphere

Jas*_*ust 5 websphere java-ee

WebSphere 6.1.0.25是否有办法防止企业应用程序因异常而启动?我有一个ServletContextListener,我装配在contextInitialized()期间抛出RuntimeException.这会在服务器日志中生成堆栈跟踪,但是WebSphere控制台仍会将应用程序显示为成功启动,并且仍可以访问WAR资源.是否有一种机制可以阻止WebSphere标记应用程序成功启动,这可以由in-WAR工件生成?

我也尝试将servlet设置为load-on-startup,并从init()抛出异常,这并没有产生我想要的效果.

小智 4

是的,有一种方法可以做到这一点,但我相信它仍然是 WebSphere 特定的。几年前我们也遇到过同样的问题,即使发生重大错误,需要大量配置的应用程序仍然会显示为已启动。判断的唯一方法是查看日志文件并查看是否发生任何异常(并且 Web UI 运行得不太好)。

处理生命周期的标准方法似乎适用于大多数容器,它是 ServletContextListener,但正如您所发现的,没有优雅的方法来处理启动错误。

在WebSphere(至少对于几个版本)中,有启动bean 的概念。您可以查看此链接http://publib.boulder.ibm.com/inforcenter...,而不是尝试详细解释它,因为几年前我就这样做了。

这本质上允许您创建一个实现两种方法的 EJB bean:

public boolean start() {
    return new Delegate().start();
}

public void stop() {
    new Delegate().stop();
}
Run Code Online (Sandbox Code Playgroud)

如果从 start 方法返回 true,它将返回成功启动,否则返回 false 将停止应用程序启动,因此在控制台中应用程序将指示它启动失败。我们实现了一个委托来完成这项工作,因此如果容器没有实现启动 bean,我们可以将其连接到启动 bean 或 ServletContextListener。

启动 bean 的唯一附加事项是,在 WebSphere 中,您需要在管理控制台中启用启动 bean 服务,否则它们将不会运行,您的应用程序也不会执行任何初始化,但在您尝试启动时仍会显示为已启动起来吧。上面的页面提供了有关如何执行此操作的信息。

我也确信 IBM 红皮书中有关于此的更详细信息,但目前我似乎无法找到它。