tomcat - Spring Boot - 等待 Web 服务器启动

标签 tomcat spring-boot

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

我试过将向其他应用程序发送消息的逻辑放在 ApplicationListener<ContextRefreshedEvent> 中但现在还为时过早。其他应用程序尝试向我发出请求但失败了。现在我已经延迟了 onApplicationEvent这行得通,但它很老套而且很活泼。

我也试过添加 ServletContextInitializer但这甚至更早触发。

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

最佳答案

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

相反,您可以使用 SpringApplicationRunListener . finished() 在 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) { }

关于tomcat - Spring Boot - 等待 Web 服务器启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28240403/

相关文章:

java - 无法使用 sudo 以其他用户身份执行命令

java - Tomcat 容器管理的 SSO Valve 和 Spring Security

java - Spring引导索引未加载

spring-boot - 在 Spring Boot 中生成 YAML 格式响应

spring-boot - 创建自定义 ErrorWebExceptionHandler 失败

java - 如何在java spring中的列表中有效重复元素?

java - Tomcat 9.0.34 的 Gradle 插件

java - Tomcat上下文管理

tomcat - Tomcat7 中的自动部署

java - 在完成授权之前,用户必须通过 Spring Security 进行身份验证