3

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

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

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

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

4

1 回答 1

1

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

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

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

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

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

于 2015-03-18T01:06:24.067 回答