개발은 하는건가..

[Springboot] 서버 재가동 RestAPI 코드 작성 본문

SpringBoot , Thymeleaf

[Springboot] 서버 재가동 RestAPI 코드 작성

수동애비 2023. 8. 25. 11:14
반응형

Springboot 서버 동작 환경을 DB 에 설정된 값을 반영하여 다시 실행해야 하는 경우가 필요할 때가 있는데 간단하게 구현하는 방법을 찾았다.

원문 사이트 : https://www.baeldung.com/java-restart-spring-boot-app

 

Programmatically Restarting a Spring Boot Application | Baeldung

Learn a few ways to restart a Spring Boot application with Java

www.baeldung.com

 

1. Springboot Application 클래스에 아래와 같이 restart() 함수를 작성한다.

@SpringBootApplication
@MapperScan(basePackages = "com.smis.datacollection")
public class SmisApplication extends SpringBootServletInitializer {

    private static ConfigurableApplicationContext _AppContext;

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return super.configure(builder);
    }

    public static void main(String[] args) {

        SpringApplication application = new SpringApplication(SmisApplication.class);

        application.addListeners(new SmisApplicationListener());

        _AppContext = application.run(args);
    }

    public static void restart() {
        ApplicationArguments args = _AppContext.getBean(ApplicationArguments.class);

        Thread appThread = new Thread(()->{
            _AppContext.close();
            _AppContext = SpringApplication.run(SmisApplication.class, args.getSourceArgs());
        });

        appThread.setDaemon(false);
        appThread.start();
    }


    @Override
    protected WebApplicationContext run(SpringApplication application) {
        return super.run(application);
    }
}

2. Application 클래스의 restart() 함수를 호출하는 restAPI 추가

@RestController
public class RestartController {
    
    @PostMapping("/restart")
    public void restart() {
    	// restart() 를 호출하기 전에 별도로 생성된 스레드 작업들이 있다면 먼저 중단 처리
        UdpPacketProcessor.getInstance().stopServer();
    
        SmisApplication.restart();
    } 
}
Comments