在我的Spring Boot应用程序中,我需要等到(默认的Tomcat)Web服务器完全初始化并准备好接收流量,然后再向其他应用程序发送消息,告诉他们向我发送HTTP请求(特别是一个点击的监控系统)我的/health
)。
我已尝试将消息发送到ApplicationListener<ContextRefreshedEvent>
中的其他应用程序,但现在还为时尚早。其他应用程序尝试向我发出请求并失败。现在我已经延迟了onApplicationEvent
,这有效,但是它很惹人讨厌。
我还尝试添加ServletContextInitializer
,但是甚至更早被解雇了。
我假设我需要使用Tomcat API,但我想看看Boot API中是否有用于此的内容。
答案 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