Spring MVC 关闭钩子
Spring MVC shutdown hook
我将 Curator 服务发现与 Spring MVC 剩余控制器一起使用,其中每个控制器在 @PostConstruct 中向 ZooKeeper 注册自己,并在 @PreDestroy 中注销自己。
我遇到的问题是,在调用@PreDestroy 方法时,控制器已经不再为请求提供服务。我需要在控制器停止服务请求之前注销控制器,以避免在控制器停止和注销之间发生的少量请求引发异常。
我已经尝试了 spring ApplicationListener 接口、SmartLifecycle 和 ServletContextListener 以及所有 shutdown/close 相关的挂钩,控制器已经停止服务请求。
我需要一个关闭钩子,我可以在控制器停止服务请求之前取消注册,但我不确定是否可用。
我不相信 Spring 中存在这样的钩子。
但是,您可以有一个特殊的控制器,映射到特定的保留 url,即以 /activity/suspend-traffic
结尾。您可能希望为此提供某种基本的安全性,也许是特定于应用程序的令牌,即 /activity/suspend-traffic/{token}
.
当这个特殊控制器收到正确的令牌时,它会从 ZK 中注销所有应用程序控制器。
这样您就不会丢失任何请求。然后,当应用程序不再接收流量时,您可以安全地关闭服务器。发送/activity/suspend-traffic/{token}
后,您可以在关闭前等待一段固定的时间,以便服务器完成对挂起命令后收到的请求的处理。
或者您可以实施更复杂的机制,即通过过滤器或 mvc 拦截器计算 "inside" 应用程序的请求数。您可以在该特殊控制器中有另一个映射,即 /activity/request-count
returns 正在处理的实际请求数。当这个请求returns0
,关闭服务器就安全了。
我将 Curator 服务发现与 Spring MVC 剩余控制器一起使用,其中每个控制器在 @PostConstruct 中向 ZooKeeper 注册自己,并在 @PreDestroy 中注销自己。
我遇到的问题是,在调用@PreDestroy 方法时,控制器已经不再为请求提供服务。我需要在控制器停止服务请求之前注销控制器,以避免在控制器停止和注销之间发生的少量请求引发异常。
我已经尝试了 spring ApplicationListener 接口、SmartLifecycle 和 ServletContextListener 以及所有 shutdown/close 相关的挂钩,控制器已经停止服务请求。
我需要一个关闭钩子,我可以在控制器停止服务请求之前取消注册,但我不确定是否可用。
我不相信 Spring 中存在这样的钩子。
但是,您可以有一个特殊的控制器,映射到特定的保留 url,即以 /activity/suspend-traffic
结尾。您可能希望为此提供某种基本的安全性,也许是特定于应用程序的令牌,即 /activity/suspend-traffic/{token}
.
当这个特殊控制器收到正确的令牌时,它会从 ZK 中注销所有应用程序控制器。
这样您就不会丢失任何请求。然后,当应用程序不再接收流量时,您可以安全地关闭服务器。发送/activity/suspend-traffic/{token}
后,您可以在关闭前等待一段固定的时间,以便服务器完成对挂起命令后收到的请求的处理。
或者您可以实施更复杂的机制,即通过过滤器或 mvc 拦截器计算 "inside" 应用程序的请求数。您可以在该特殊控制器中有另一个映射,即 /activity/request-count
returns 正在处理的实际请求数。当这个请求returns0
,关闭服务器就安全了。