programing

Spring Boot 명령줄 응용 프로그램을 셧다운하는 방법

powerit 2023. 3. 9. 22:23
반응형

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

반응형