【问题标题】:Best way to force Spring shutdown from a bean?从bean强制关闭Spring的最佳方法?
【发布时间】:2010-03-08 12:55:17
【问题描述】:

我的应用程序使用 Spring DefaultMessageListenerContainer 来处理传入消息。应用的 main 方法已经注册了一个关闭钩子。

问题是:强制关闭应用程序上下文的最佳方法是什么?

如果我在消息侦听器中抛出RuntimeException,它由容器处理,而不是传递。调用 System.exit 可以接受吗?我是否将ApplicationContext 传递给每个需要关闭的类,以便我可以调用close()

【问题讨论】:

  • 为什么需要关闭应用上下文?
  • 因为消息监听器可以决定它需要;要么是因为它收到了一条要求关闭应用程序的管理消息,要么是因为发生了异常情况。有很多,其中之一是接收到的重试次数过多(这是一个高容量系统)

标签: java spring


【解决方案1】:

您可以将您的应用程序上下文转换为ConfigurableApplicationContext 并在其上调用close()。至少在 web 应用程序环境中关闭上下文时会发生这种情况,以防 servlet 上下文被破坏。

如果你想获得ApplicationContext,你的bean可以实现ApplicationContextAware

另一种选择是注入(或使用@Autowired 自动装配)应用程序上下文:

@Inject
private ApplicationContext ctx;

【讨论】:

  • 需要关闭的bean如何获​​取上下文?毕竟是 POJO..
  • @xcut 这取决于您的应用程序。它是 Web 应用程序还是桌面应用程序?
  • 两者都不是 - 消息队列/路由系统。所以我想唯一的方法是将上下文传递给 bean,或者实现某种额外的生命周期接口?
  • @xcut 不,执行ApplicationContextAware
  • 或者直接注入ApplicationContext。你不需要实现 ApplicationContextAware...
猜你喜欢
  • 2012-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多