我正在使用Spring MVC实现RESTful Web服务。当服务启动时,它需要注册自己,以便客户端可以找到它。我目前正在@Controller类的@PostConstruct方法中执行此操作。但这会在服务实际准备好接收请求之前注册服务,因为Web容器尚未侦听Web请求。我希望在Web容器完成所有初始化并正在侦听请求之后注册该服务。
我找了一个监听器和/或事件,它会在容器启动时通知我,但我还没找到。
我可能“过早地优化”。最终的完整部署环境需要对每个服务的一组副本进行负载平衡,负载均衡器必须负责确定每个实例的实际服务可用性和当前负载。
修改:进一步澄清。
我想用外部注册表注册该服务(具体来说,在这种情况下,是一个Zookeeper实例。)我希望在应用服务器具有<之前,不将该服务添加到注册表中em>已完成初始化,并且“对业务开放”。当我使用@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
...
答案 0 :(得分:3)
您要查找的侦听器是javax.servlet.ServletContextListener
及其contextInitialized(..)
方法(并在web.xml中使用<listener><listener-class>..
或@WebListener
注册)
如果你需要一个春天豆,你可以使用:
WebApplicationContextUtils.getRequiredWebApplicationContext(ctx).getBean(..);
答案 1 :(得分:0)
我的第一个猜测是你应该看看javax.servlet.ServletContextListener,但我不确定这是否会对你有所帮助,因为Spring通常是在这样一个听众中初始化的。检查您的web.xml
是否有这样的行:
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
如果有,那么ApplicationContext
将在创建上下文后立即创建(理论上,应用程序可以在此时提供请求,但在实践中,您已进入最终配置相)。
所以问题是你想要实现的目标。如果要为每个请求创建一个新bean,请使用&#34; request&#34;范围。
如果您只是想延迟创建bean,那么您应该给出技术原因。