Spring Boot 명령줄 응용 프로그램을 셧다운하는 방법
빨리 동작시키기 위해 Spring Boot을 사용하여 Command Line Java 어플리케이션을 구축하고 있습니다.
응용 프로그램은 다양한 유형의 파일(예를 들어 CSV)을 로드하여 Cassandra 데이터베이스에 로드합니다.웹 컴포넌트도 웹 어플리케이션도 사용하지 않습니다.
제가 안고 있는 문제는 작업이 끝나면 애플리케이션을 정지하는 것입니다.Spring CommandLineRunner 인터페이스를 사용하여@Component
아래와 같이 작업을 실행하는데, 작업이 완료되어도 애플리케이션이 정지하지 않고, 어떠한 이유로 계속 실행되어 정지할 수 없습니다.
@Component
public class OneTimeRunner implements CommandLineRunner {
@Autowired
private CassandraOperations cassandra;
@Autowired
private ConfigurableApplicationContext context;
@Override
public void run(String... args) throws Exception {
// do some work here and then quit
context.close();
}
}
업데이트: 문제는 다음과 같습니다.spring-cassandra
프로젝트에는 다른 것이 없기 때문입니다.애플리케이션 정지를 방해하는 스레드를 백그라운드에서 계속 실행하는 이유를 알고 있는 사람이 있습니까?
업데이트: 최신 스프링 부트 버전으로 업데이트하여 문제가 해결되었습니다.
해결책을 찾았어요다음을 사용할 수 있습니다.
public static void main(String[] args) {
SpringApplication.run(RsscollectorApplication.class, args).close();
System.out.println("done");
}
그냥 사용하다.close()
실행 중
그 답은 아직 하고 있는 일이 무엇이냐에 달려 있다.스레드 덤프를 사용하면 알 수 있습니다(예: jstack 사용).하지만 봄에 시작된 어떤 것이라도 당신은 그것을 사용할 수 있어야 한다.ConfigurableApplicationContext.close()
main() 메서드(또는 main() 메서드)에서 앱을 정지합니다.CommandLineRunner
).
이것은 @EliuX answer와 @Quan Vo one의 조합입니다.둘 다 고마워요!
주요 차이점은 Spring Application.exit(콘텍스트) 응답 코드를 파라미터로 System.exit()에 전달한다는 것입니다.따라서 Spring 컨텍스트를 닫는 동안 오류가 발생하면 알 수 있습니다.
Spring Application.exit()은 Spring 컨텍스트를 닫습니다.
System.exit()가 애플리케이션을 닫습니다.
@Component
public class OneTimeRunner implements CommandLineRunner {
@Autowired
private ConfigurableApplicationContext context;
@Override
public void run(String... args) throws Exception {
System.exit(SpringApplication.exit(context));
}
}
이번 프로젝트(스프링 부트 어플리케이션)에서도 이 문제가 발생하였습니다.솔루션은 다음과 같습니다.
// releasing all resources
((ConfigurableApplicationContext) ctx).close();
// Close application
System.exit(0);
context.close()
콘솔 어플리케이션을 정지하지 마세요.리소스를 해방하고 있을 뿐입니다.
사용하다org.springframework.boot.SpringApplication#exit
.예.
@Component
public class OneTimeRunner implements CommandLineRunner {
@Autowired
private ConfigurableApplicationContext context;
@Override
public void run(String... args) throws Exception {
SpringApplication.exit(context);
}
}
매달린 스레드가 없는 경우 응용 프로그램이 자동으로 중지됩니다.exit()
저도 같은 문제가 있었는데, 결국 왜 그런 일이 일어나는지 이유를 찾았어요.나는 항상 스프링 메커니즘에 의존합니다. 스프링 메커니즘은 모든 것을 닫습니다.Closeable
응용 프로그램이 종료될 때 콩이 발생하지만 JVM 종료 후크에서 호출되므로 데몬 이외의 스레드가 실행될 때까지 호출되지 않습니다.모든 원두를 열어서 수동으로 닫아서 문제를 해결했습니다.CommandLineRunner
자동 의해 콩 created created created created created(((((((((((((((((((((((((()에도 필요합니다spring-data-elasticsearch
을 참조)
명령줄 응용 프로그램은 종료 시 종료 코드를 반환해야 합니다.이 투고에서는 ExitCodeGenerator 사용방법 및 스프링애플리케이션에서의 사용방법에 대해 설명합니다.이 접근방식은 저에게 효과가 있었습니다.
@SpringBootApplication 퍼블릭클래스 ExitCodeGeneratorDemoApplication이 ExitCodeGenerator{를 구현합니다.
public static void main(String[] args) {
System.exit(SpringApplication
.exit(SpringApplication.run(DemoApplication.class, args)));
}
@Override
public int getExitCode() {
return 42;
}
}
https://www.baeldung.com/spring-boot-exit-codes
언급URL : https://stackoverflow.com/questions/26329300/how-to-shut-down-a-spring-boot-command-line-application
'programing' 카테고리의 다른 글
Wordpress 사용자 지정 필드에 대한 최종 구성원 편집 검색 필터 (0) | 2023.03.09 |
---|---|
를 도입하기 위해 필요한 최소 셋업은 무엇입니까?Oracle 클라이언트 11을 사용하는 NET 애플리케이션 (0) | 2023.03.09 |
WordPress JSON API가 404개의 오류만 반환합니다. (0) | 2023.03.09 |
npm 패키지json 스크립트가 호출되지 않음 (0) | 2023.03.09 |
'+'(더하기 기호)가 문자열 URL을 사용하여 RestTemplate로 인코딩되지 않고 '(스페이스)'로 해석됩니다. (0) | 2023.03.09 |