如何在Web容器成功启动后在servlet或控制器上调用方法

时间:2012-05-07 14:51:04

标签: java servlets spring-mvc

我正在使用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
...

2 个答案:

答案 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,那么您应该给出技术原因。