我正在使用带有Spring MVC休息控制器的Curator服务发现,其中每个控制器在@PostConstruct中使用ZooKeeper注册自己,并在@PreDestroy中取消注册。
我遇到的问题是,在调用@PreDestroy方法时,控制器已经不再处理请求了。我需要在控制器停止服务请求之前取消注册控制器,以避免在控制器停止和取消注册之间发生的少量请求抛出异常。
我已经尝试了Spring ApplicationPistener接口,SmartLifecycle和ServletContextListener,并且在所有关闭/关闭相关的钩子中,控制器已经停止了服务请求。
我需要一个关闭钩子,我可以在控制器停止服务请求之前取消注册,我不确定是否有可用的。
答案 0 :(得分:1)
我不相信Spring中存在这样的钩子。
但是,您可以拥有一个特殊的控制器,映射到特定的保留URL,即以/activity/suspend-traffic
结尾。您可能希望获得某种基本安全性,可能是特定于应用程序的令牌,即/activity/suspend-traffic/{token}
。
当此特殊控制器收到正确的令牌时,它会从ZK注销所有应用程序控制器。
这样你就不会失去任何请求。然后,当应用程序不再接收流量时,您可以安全地关闭服务器。发送/activity/suspend-traffic/{token}
之后,您可以等待一段固定的时间,然后停止,以便服务器完成处理暂停命令后收到的请求。
或者您可以实现更复杂的机制,即通过过滤器或mvc拦截器来计算有多少请求是"内部"应用程序。您可以在该特殊控制器中使用另一个映射,即/activity/request-count
,它返回正在处理的实际请求数。当此请求返回0
时,关闭服务器是安全的。