【发布时间】: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,你最终会遇到问题,特别是如果你有多个上下文(即
ContextLoaderListener和DispatcherServlet. )。抛出异常基本上是在发出异常情况的信号,这将由框架处理,并应导致完全停止您的应用程序。 -
从来没有说过这是个好主意,这是一种选择(几乎不是好选择)。抛出异常是可接受的方式。
标签: java spring servlets jakarta-ee