小编典典

Spring Boot-等待Web服务器启动

spring-boot

在我的Spring
Boot应用程序中,我需要等到(默认的Tomcat)Web服务器完全初始化并准备进行流量处理,然后再向其他应用程序发送消息,告诉它们向我发送HTTP请求(特别是命中my的监视系统/health)。

我曾尝试将可将消息发送到其他应用程序的逻辑放在一个中,ApplicationListener<ContextRefreshedEvent>但这还为时过早。其他应用程序尝试向我发出请求,但失败。现在,我已经延迟了onApplicationEvent和的工作时间,但是它很老套和缺乏礼貌。

我也尝试添加一个,ServletContextInitializer但更早就触发了。

我假设我需要使用Tomcat API,但我想查看Boot API中是否有此功能。


阅读 503

收藏
2020-05-30

共1个答案

小编典典

最简单的方法是一旦SpringApplication.run()返回就发送消息。直到Tomcat(或任何其他受支持的嵌入式容器)完全启动并在配置的端口上侦听后,该方法才会返回。但是,尽管这很简单,但这并不是一个很好的方法,因为它将主要配置类和应用程序的某些运行时逻辑混合在一起。

相反,您可以使用SpringApplicationRunListenerfinished()在Tomcat完全启动并在配置的端口上侦听之前,将不会调用该命令。

创建一个名为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) { }
2020-05-30