【问题标题】:Spring Web Application: Shutdown if initialization failsSpring Web 应用程序:如果初始化失败则关闭
【发布时间】:2016-11-28 03:14:09
【问题描述】:

我有一个 Spring Web 应用程序。当应用程序上下文启动时,我使用ApplicationListener<ContextRefreshedEvent> 执行一些应用程序初始化,特别是我从 Web 服务加载数据。如果无法访问此 Web 服务,那么我的应用程序将无法做任何有用的事情,并且保持其运行也没有任何意义。有没有办法以编程方式关闭应用程序上下文?

我已尝试执行以下操作:

if (contextRefreshedEvent instanceof ConfigurableApplicationContext)
{
    ConfigurableApplicationContext configurableApplicationContext
            = (ConfigurableApplicationContext) contextRefreshedEvent;
    configurableApplicationContext.close ();
}

但不是优雅地关闭会产生以下异常:

java.lang.IllegalStateException: BeanFactory 未初始化或已关闭 - 在通过 ApplicationContext 访问 bean 之前调用“刷新”

那么在这种情况下关闭应用程序的正确方法是什么?

【问题讨论】:

  • 您可以设置一些计划的操作来检查服务是否启动,并等待它启动。但是在启动时通过异常关闭应用程序是可以的。或者,您可以捕获异常并运行 system.exit(0) 并使用日志记录原因,如果它列在某些异常列表中,否则会排除异常
  • 调用System.exit 是一个非常糟糕的主意,好像你很不走运,也可能会杀死你的服务器,这几乎不是你想要的。只需抛出一个异常,它基本上会阻止应用程序启动。
  • 我知道使用System.exit 的选项,但我同意@M.Deinum 这不是一个好主意。有没有干净的方法可以避免抛出异常?
  • 如果你开始调用 close,你最终会遇到问题,特别是如果你有多个上下文(即 ContextLoaderListenerDispatcherServlet. )。抛出异常基本上是在发出异常情况的信号,这将由框架处理,并应导致完全停止您的应用程序。
  • 从来没有说过这是个好主意,这是一种选择(几乎不是好选择)。抛出异常是可接受的方式。

标签: java spring servlets jakarta-ee


【解决方案1】:

抛出一个ApplicationContextException。它适用于 Spring 4.2.7.RELEASE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2023-04-05
    • 2013-06-16
    • 1970-01-01
    • 2021-07-23
    • 2011-10-15
    相关资源
    最近更新 更多