programing

Spring Boot - 웹 서버가 시작될 때까지 대기

abcjava 2023. 8. 4. 22:34
반응형

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

반응형