프로그래밍 방식으로 Spring Boot 애플리케이션 다시 시작

1. 개요

이 튜토리얼에서는 Spring Boot 애플리케이션프로그래밍 방식으로 다시 시작하는 방법을 보여줍니다 .

응용 프로그램을 다시 시작하면 다음과 같은 경우 매우 편리 할 수 ​​있습니다.

  • 일부 매개 변수 변경시 구성 파일 다시로드
  • 런타임에 현재 활성 프로필 변경
  • 어떤 이유로 든 애플리케이션 컨텍스트 다시 초기화

이 기사에서는 Spring Boot 애플리케이션을 다시 시작하는 기능을 다루지 만 Spring Boot 애플리케이션 종료에 대한 훌륭한 튜토리얼도 있습니다.

이제 Spring Boot 애플리케이션의 재시작을 구현할 수있는 다양한 방법을 살펴 보겠습니다.

2. 새 컨텍스트를 만들어 다시 시작

애플리케이션 컨텍스트를 닫고 처음부터 새 컨텍스트를 작성하여 애플리케이션을 다시 시작할 수 있습니다. 이 접근 방식은 매우 간단하지만 제대로 작동하려면주의해야 할 몇 가지 섬세한 세부 사항이 있습니다.

Spring Boot 앱 의 주요 메서드 에서이를 구현하는 방법을 살펴 보겠습니다 .

@SpringBootApplication public class Application { private static ConfigurableApplicationContext context; public static void main(String[] args) { context = SpringApplication.run(Application.class, args); } public static void restart() { ApplicationArguments args = context.getBean(ApplicationArguments.class); Thread thread = new Thread(() -> { context.close(); context = SpringApplication.run(Application.class, args.getSourceArgs()); }); thread.setDaemon(false); thread.start(); } }

위의 예에서 볼 수 있듯이 별도의 데몬이 아닌 스레드에서 컨텍스트를 다시 만드는 것이 중요합니다. 이렇게하면 close 메서드 에 의해 트리거 된 JVM 종료가 애플리케이션을 닫는 것을 방지 할 수 있습니다. 그렇지 않으면 JVM이 데몬 스레드를 종료하기 전에 완료 될 때까지 기다리지 않기 때문에 애플리케이션이 중지됩니다.

또한 재시작을 트리거 할 수있는 REST 엔드 포인트를 추가해 보겠습니다.

@RestController public class RestartController { @PostMapping("/restart") public void restart() { Application.restart(); } }

여기에서 다시 시작 메서드 를 호출하는 매핑 메서드가있는 컨트롤러를 추가했습니다 .

그런 다음 새 엔드 포인트를 호출하여 애플리케이션을 다시 시작할 수 있습니다.

curl -X POST localhost:port/restart

물론 실제 애플리케이션에 이와 같은 엔드 포인트를 추가하는 경우에도 보안을 유지해야합니다.

3. 액추에이터의 재시작 끝점

애플리케이션을 다시 시작하는 또 다른 방법 은 Spring Boot Actuator 의 기본 제공 RestartEndpoint 를 사용하는 것 입니다.

먼저 필요한 Maven 종속성을 추가해 보겠습니다.

 org.springframework.boot spring-boot-starter-actuator   org.springframework.boot spring-cloud-starter 

다음으로 application.properties 파일 에서 기본 제공 다시 시작 엔드 포인트를 활성화해야 합니다.

management.endpoint.restart.enabled=true

이제 모든 것을 설정 했으므로 서비스에 다시 시작 엔드 포인트 를 삽입 할 수 있습니다 .

@Service public class RestartService { @Autowired private RestartEndpoint restartEndpoint; public void restartApp() { restartEndpoint.restart(); } }

위의 코드에서는 RestartEndpoint 빈을 사용하여 애플리케이션을 다시 시작합니다. 모든 작업을 수행하는 하나의 메서드 만 호출하면되므로 다시 시작하는 좋은 방법입니다.

보시다시피 RestartEndpoint를 사용하는 것은 애플리케이션을 다시 시작하는 간단한 방법입니다. 반면에 언급 된 라이브러리를 추가해야하기 때문에이 접근 방식에는 단점이 있습니다. 아직 사용하지 않는 경우이 기능에만 너무 많은 오버 헤드가 발생할 수 있습니다. 이 경우 코드 몇 줄만 더 필요하므로 이전 섹션의 수동 접근 방식을 고수 할 수 있습니다.

4. 애플리케이션 컨텍스트 새로 고침

어떤 경우에는 refresh 메소드를 호출하여 애플리케이션 컨텍스트를 다시로드 할 수 있습니다.

이 방법이 유망하게 들릴 수 있지만 일부 응용 프로그램 컨텍스트 유형 만 이미 초기화 된 컨텍스트 새로 고침을 지원합니다. 예를 들어 FileSystemXmlApplicationContext , GroovyWebApplicationContext 및 기타 몇 가지가이를 지원합니다.

안타깝게도 Spring Boot 웹 애플리케이션에서이 작업을 시도하면 다음 오류가 발생합니다.

java.lang.IllegalStateException: GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once

마지막으로 다중 새로 고침을 지원하는 컨텍스트 유형이 있지만이를 피해야합니다. 그 이유는 새로 고침 메서드가 프레임 워크에서 응용 프로그램 컨텍스트를 초기화하는 데 사용하는 내부 메서드로 설계 되었기 때문입니다 .

5. 결론

이 기사에서는 Spring Boot 애플리케이션을 프로그래밍 방식으로 다시 시작하는 방법에 대해 여러 가지 방법을 살펴 보았습니다.

항상 그렇듯이 GitHub에서 예제의 소스 코드를 찾을 수 있습니다.