我正在用Spring实现一个RESTful web服务。当服务启动时,它需要注册自己,以便客户能够找到它。我目前正在@Controller类的@PostConstruct方法中执行此操作。但是这会在服务真正准备好接收请求之前注册,因为web容器还没有侦听web请求。我更愿意在web容器完成所有初始化并侦听请求之后注册服务。
我寻找了一个侦听器和/或事件,它将在容器启动时通知我,但我没有找到一个。
我可能是“过早地优化”。最终的全部署环境需要负载平衡每个服务的一组副本,负载均衡器必须负责确定每个实例的实际服务可用性和当前负载。
编辑:额外的澄清。
我希望将服务注册到外部注册表中(特别是,在本例中,是实例)。我希望在应用服务器完成初始化并“面向业务开放”之前,不要将服务添加到注册表中。当我使用@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
...发布于 2012-05-07 15:32:09
您要寻找的侦听器是javax.servlet.ServletContextListener及其contextInitialized(..)方法(并将其注册到web.xml中的<listener><listener-class>..或@WebListener中)
如果您需要一个spring,您可以使用:
WebApplicationContextUtils.getRequiredWebApplicationContext(ctx).getBean(..);发布于 2012-05-07 15:39:38
我的第一个猜测是,您应该查看javax.servlet.ServletContextListener,但我不确定这是否会对您有所帮助,因为Spring通常是在这样的侦听器中初始化的。请检查您的web.xml中是否有如下一行:
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>如果存在这种情况,那么ApplicationContext将在上下文创建后立即创建(理论上,应用程序此时可以处理请求,但实际上,您正处于最后的配置阶段)。
所以问题是你想要实现什么。如果您想为每个请求创建一个新bean,请使用“请求”范围。
如果您只想延迟bean的创建,那么您应该给出一个这样做的技术理由。
https://stackoverflow.com/questions/10484186
复制相似问题