【问题标题】:Spring MVC shutdown hookSpring MVC 关闭钩子
【发布时间】:2023-03-19 22:21:01
【问题描述】:

我将 Curator 服务发现与 Spring MVC 休息控制器一起使用,其中每个控制器在 @PostConstruct 中向 ZooKeeper 注册自己,并在 @PreDestroy 中取消注册自己。

我遇到的问题是,在调用 @PreDestroy 方法时,控制器已经不再为请求提供服务。我需要在控制器停止服务请求之前取消注册控制器,以避免在控制器停止和取消注册之间发生的少量请求引发异常。

我已经尝试过 spring ApplicationListener 接口、SmartLifecycle 和 ServletContextListener,并且在所有与关闭/关闭相关的挂钩中,控制器已经停止服务请求。

我需要一个关闭挂钩,以便在控制器停止服务请求之前取消注册,但我不确定是否有可用的挂钩。

【问题讨论】:

  • ...那么问题是什么?
  • 问题是我需要一个关闭钩子,我可以在控制器停止服务请求之前 取消注册,但我不确定它是否可用。
  • 啊,我明白了。您能否在问题本身中澄清这一点?目前,它只是对情况的描述,没有明确的需求。
  • 你没有使用Spring Cloud吗?我试图弄清楚 Spring Cloud 是如何管理它的。当我杀死一个服务时,它最终会从 Zookeeper 中删除,但只是在 10-12 秒之间,在此期间,请求将失败。我无法弄清楚该过程是如何发生的,以便在部署期间对其进行改进

标签: spring spring-mvc apache-curator


【解决方案1】:

我不相信 Spring 中存在这样的钩子。

但是,您可以有一个特殊的控制器,映射到特定的保留 url,即以 /activity/suspend-traffic 结尾。您可能希望为此提供某种基本的安全性,可能是特定于应用程序的令牌,即/activity/suspend-traffic/{token}

当这个特殊控制器接收到正确的令牌时,它会从 ZK 注销所有应用程序控制器。

这样您就不会丢失任何请求。然后,当应用程序不再接收流量时,您可以安全地关闭服务器。发送/activity/suspend-traffic/{token}后,您可以等待一段固定的时间再关闭,以便服务器完成对挂起命令后收到的请求的处理。

或者您可以实现更复杂的机制,即通过过滤器或 mvc 拦截器来计算应用程序“内部”有多少请求。您可以在该特殊控制器中有另一个映射,即/activity/request-count,它返回正在处理的实际请求数。当这个请求返回0时,关闭服务器是安全的。

【讨论】:

    猜你喜欢
    • 2014-12-27
    • 1970-01-01
    • 2018-01-23
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    相关资源
    最近更新 更多