Spring Boot - 웹 서버가 시작될 때까지 대기
Spring Boot 응용 프로그램에서 (기본 Tomcat) 웹 서버가 완전히 초기화되고 트래픽을 수신할 준비가 될 때까지 기다린 후 다른 응용 프로그램에 HTTP 요청을 보내라는 메시지를 보냅니다(특히 나를 공격하는 모니터링 시스템)./health
).
저는 다른 애플리케이션에 메시지를 보내는 논리를 넣어 보았습니다.ApplicationListener<ContextRefreshedEvent>
하지만 아직은 너무 일러요.다른 애플리케이션들은 나에게 요청을 하려고 시도하다가 실패합니다.지금 당장은 제가 시간을 지체시켰습니다.onApplicationEvent
그리고 그것은 효과가 있지만, 그것은 구식이고 야성적입니다.
나는 또한 추가를 시도했습니다.ServletContextInitializer
하지만 그것은 훨씬 더 일찍 발사되었습니다.
Tomcat API를 사용해야 할 것 같습니다만, 이를 위한 Boot API에 무언가가 있는지 확인하고 싶었습니다.
가장 간단한 방법은 메시지를 한 번 보내는 것입니다.SpringApplication.run()
돌아왔습니다.Tomcat(또는 지원되는 다른 내장형 컨테이너)가 완전히 시작되고 구성된 포트에서 수신될 때까지 이 메서드는 반환되지 않습니다.그러나 이 방법은 간단하지만 기본 구성 클래스와 응용 프로그램의 런타임 로직 중 일부에 대한 우려를 혼합하기 때문에 그다지 깔끔한 방법은 아닙니다.
대신 를 사용할 수 있습니다.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) { }
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
언급URL : https://stackoverflow.com/questions/28240403/spring-boot-wait-for-web-server-to-start
'programing' 카테고리의 다른 글
Android에서 나만의 URI 체계를 구현하는 방법 (0) | 2023.08.09 |
---|---|
도커 컨테이너에서 실행되는 Spring Boot 응용 프로그램의 상태를 확인하는 방법은 무엇입니까? (0) | 2023.08.04 |
C에서의 유니온의 예 (0) | 2023.08.04 |
URL 매개 변수 값 가져오기 (0) | 2023.08.04 |
ECMA스크립트 6에는 추상 클래스에 대한 규약이 있습니까? (0) | 2023.08.04 |