Spring Boot 응용 프로그램을 프로그래밍 방식으로 셧다운합니다.
VM을 종료하지 않고 Spring Boot 애플리케이션을 프로그래밍 방식으로 종료하려면 어떻게 해야 합니까?
다른 작품에서, 의 반대는 무엇인가?
new SpringApplication(Main.class).run(args);
를 닫는다는 것은 기본적으로 기본을 닫는 것을 의미합니다.ApplicationContext
그 방법을 통해 얻을 수 있습니다.ApplicationContext
로서ConfigurableApplicationContext
그럼 직접 하실 수 있습니다.
예를들면,
@SpringBootApplication
public class Example {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(Example.class, args);
// ...determine it's time to shut down...
ctx.close();
}
}
또는 를 사용할 수 있습니다.static
SpringApplication.exit(ApplicationContext, ExitCodeGenerator...)
도우미 방법을 소개합니다.예를들면,
@SpringBootApplication
public class Example {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = SpringApplication.run(Example.class, args);
// ...determine it's time to stop...
int exitCode = SpringApplication.exit(ctx, new ExitCodeGenerator() {
@Override
public int getExitCode() {
// no errors
return 0;
}
});
// or shortened to
// int exitCode = SpringApplication.exit(ctx, () -> 0);
System.exit(exitCode);
}
}
가장 간단한 방법은 셧다운을 시작해야 하는 곳에 다음 개체를 주입하는 것입니다.
Shutdown Manager.java
import org.springframework.context.ApplicationContext;
import org.springframework.boot.SpringApplication;
@Component
class ShutdownManager {
@Autowired
private ApplicationContext appContext;
/*
* Invoke with `0` to indicate no error or different code to indicate
* abnormal exit. es: shutdownManager.initiateShutdown(0);
**/
public void initiateShutdown(int returnCode){
SpringApplication.exit(appContext, () -> returnCode);
}
}
이 작품은 완성되어도 인쇄되어 있습니다.
SpringApplication.run(MyApplication.class, args).close();
System.out.println("done");
그래서 더하기.close()
끝나고run()
설명:
public ConfigurableApplicationContext run(String... args)
Spring 응용 프로그램을 실행하여 새 ApplicationContext를 만들고 새로 고칩니다.파라미터:
args
- 응용 프로그램 인수(보통 Java 메인 메서드에서 전달됨)반환: 실행 중인 Application Context
또, 다음과 같이 합니다.
void close()
이 응용 프로그램콘텍스트를 닫고 구현이 유지할 수 있는 모든 리소스와 잠금을 해제합니다.여기에는 캐시된 모든 싱글톤 빈의 파괴가 포함됩니다.주의: 부모 콘텍스트에서는 닫힘을 호출하지 않습니다.부모 콘텍스트에는 독자적인 독립된 라이프 사이클이 있습니다.이 방법은 부작용 없이 여러 번 호출할 수 있습니다.이미 닫힌 컨텍스트에서의 후속 종료 콜은 무시됩니다.
따라서 기본적으로 상위 컨텍스트가 닫히지 않으므로 VM이 종료되지 않습니다.
그러면 SpringBoot 응용 프로그램이 올바르게 닫히고 리소스가 운영체제로 돌아갑니다.
@Autowired
private ApplicationContext context;
@GetMapping("/shutdown-app")
public void shutdownApp() {
int exitCode = SpringApplication.exit(context, (ExitCodeGenerator) () -> 0);
System.exit(exitCode);
}
응용 프로그램에서 사용할 수 있습니다.SpringApplication
이건 잡음이 있어요exit()
두 개의 인수를 사용하는 메서드:ApplicationContext
그리고ExitCodeGenerator
:
즉, 다음 방법을 선언할 수 있습니다.
@Autowired
public void shutDown(ExecutorServiceExitCodeGenerator exitCodeGenerator) {
SpringApplication.exit(applicationContext, exitCodeGenerator);
}
통합 테스트에서 다음을 추가하여 이를 달성할 수 있습니다.@DirtiesContext
클래스 레벨에서의 주석:
@DirtiesContext(classMode=ClassMode.AFTER_CLASS)
- 관련 Application Context는 테스트 클래스 후 더티로 표시됩니다.@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)
- 클래스 내의 각 테스트 메서드가 끝나면 관련된 Application Context가 더티로 표시됩니다.
예.
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {Application.class},
webEnvironment= SpringBootTest.WebEnvironment.DEFINED_PORT, properties = {"server.port:0"})
@DirtiesContext(classMode= DirtiesContext.ClassMode.AFTER_CLASS)
public class ApplicationIT {
...
언급URL : https://stackoverflow.com/questions/22944144/programmatically-shut-down-spring-boot-application
'source' 카테고리의 다른 글
버튼을 클릭해서 PHP 함수를 호출하는 방법 (0) | 2023.01.22 |
---|---|
포괄적인 초보자용 virtualenv 튜토리얼? (0) | 2023.01.22 |
ImportError: MySQLdb라는 이름의 모듈이 없습니다. (0) | 2023.01.15 |
@property와 getters 및 setter의 비교 (0) | 2023.01.15 |
MySQL 오류 1215: 외부 키 제약 조건을 추가할 수 없습니다. (0) | 2023.01.15 |