我正在使用 Spring MVC 实现一个 RESTful Web 服务。当服务启动时,它需要注册自己,以便客户端可以找到它。我目前正在 @Controller 类的 @PostConstruct 方法中执行此操作。但这会在服务实际准备好接收请求之前注册服务,因为 Web 容器尚未侦听 Web 请求。我希望在 Web 容器完成所有初始化并正在侦听请求后注册服务。
我一直在寻找一个监听器和/或事件,它会在容器启动时通知我,但我还没有找到。
我可能“过早优化”。最终的完整部署环境将需要对每个服务的一组副本进行负载平衡,并且负载平衡器必须负责确定每个实例的实际服务可用性和当前负载。
编辑:附加说明。
我想向外部注册表注册服务(具体而言,在本例中是 Zookeeper 实例)。我希望在应用程序服务器完成初始化并“营业”之前不要将服务添加到注册表中。当我使用 @PostConstruct 时,它似乎给出了与 相同的基本顺序ServletContextListener.contextInitialized()
,我的日志输出看起来像这样:
INFO : MyController - Registering service foo 0.1.0 at 192.168.34.15:8080
...
May 7, 2012 3:42:49 PM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
May 7, 2012 3:42:49 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
我想看到的是:
INFO: Starting Coyote HTTP/1.1 on http-8080
...
INFO : MyController - Registering service foo 0.1.0 at 192.168.34.15:8080
...