Spring Boot - 等待Web服务器启动

时间:2015-01-30 16:33:05

标签: tomcat spring-boot

在我的Spring Boot应用程序中,我需要等到(默认的Tomcat)Web服务器完全初始化并准备好接收流量,然后再向其他应用程序发送消息,告诉他们向我发送HTTP请求(特别是一个点击的监控系统)我的/health)。

我已尝试将消息发送到ApplicationListener<ContextRefreshedEvent>中的其他应用程序,但现在还为时尚早。其他应用程序尝试向我发出请求并失败。现在我已经延迟了onApplicationEvent,这有效,但是它很惹人讨厌。

我还尝试添加ServletContextInitializer,但是甚至更早被解雇了。

我假设我需要使用Tomcat API,但我想看看Boot API中是否有用于此的内容。

2 个答案:

答案 0 :(得分:19)

最简单的方法是在SpringApplication.run()返回后发送消息。在Tomcat(或任何其他受支持的嵌入式容器)完全启动并侦听配置的端口之前,此方法不会返回。然而,虽然这很简单,但它并不是一个非常简洁的方法,因为它混合了主配置类和一些应用程序的运行时逻辑的关注点。

相反,您可以使用SpringApplicationRunListener。在Tomcat完全启动并侦听配置的端口之前,不会调用finished()

创建一个名为src/main/resources/META-INF/spring.factories的文件,列出您的运行监听器。例如:

org.springframework.boot.SpringApplicationRunListener=com.example.MyRunListener

使用所需的构造函数创建运行侦听器并实现SpringApplicationRunListener。例如:

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

public class MyRunListener implements SpringApplicationRunListener {

    public MyRunListener(SpringApplication application, String[] args) { }

    @Override
    public void starting() { }

    @Override
    public void environmentPrepared(ConfigurableEnvironment environment) { }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) { }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) { }

    @Override
    public void started(ConfigurableApplicationContext context) {
        // Send message; Tomcat is running and listening on the configured port(s)
    }

    @Override
    public void running(ConfigurableApplicationContext context) { }

    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) { }

答案 1 :(得分:7)

从Spring Boot 1.3.0开始,这也可以通过实现ApplicationListener<ApplicationReadyEvent>

来实现

示例:

public class MyApplicationListener implements ApplicationListener<ApplicationReadyEvent>, Ordered {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        //do stuff now that application is ready
    }

    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

此外,如接受的答案中所述,您可以创建一个名为src/main/resources/META-INF/spring.factories的文件,列出您的ApplicationListener。例如:

org.springframework.context.ApplicationListener=com.example.MyApplicationListener

但是,在我的情况下,我只需要在特定的配置文件

下运行此侦听器

所以我将以下属性添加到application-<profile_name>.properties

context.listener.classes=com.example.MyApplicationListener
相关问题