복붙노트

[SPRING] 어떻게 봄 부팅 데몬 / 서버 응용 프로그램이 즉시 종료 / 종료되지 않도록하려면?

SPRING

어떻게 봄 부팅 데몬 / 서버 응용 프로그램이 즉시 종료 / 종료되지 않도록하려면?

내 스프링 부팅 응용 프로그램은 웹 서버가 아니지만 사용자 지정 프로토콜을 사용하는 서버입니다 (이 경우 Camel을 사용).

하지만 Spring Boot는 시작한 후 (정상적으로) 멈 춥니 다. 어떻게 이것을 막을 수 있습니까?

Ctrl + C 또는 프로그래밍 방식으로 앱을 중지하고 싶습니다.

@CompileStatic
@Configuration
class CamelConfig {

    @Bean
    CamelContextFactoryBean camelContext() {
        final camelContextFactory = new CamelContextFactoryBean()
        camelContextFactory.id = 'camelContext'
        camelContextFactory
    }

}

해결법

  1. ==============================

    1.Apache Camel 2.17부터는 더 깨끗한 답이 있습니다. http://camel.apache.org/spring-boot.html을 인용하십시오.

    Apache Camel 2.17부터는 더 깨끗한 답이 있습니다. http://camel.apache.org/spring-boot.html을 인용하십시오.

    당신은 다음과 같은 의존성을 원할 것입니다 :

    <의존성>      org.apache.camel      낙타 스프링 부트 시동기      2.17.0

    명확하게 2.17.0 을 대체하거나 낙타 BOM을 사용하여 일관성을 위해 종속성 관리 정보를 가져옵니다.

  2. ==============================

    2.org.springframework.boot.CommandLineRunner + Thread.currentThread (). join ()을 사용하여 해결책을 찾았습니다. 예 : (참고 : 아래 코드는 Java가 아닌 Groovy에 있습니다.)

    org.springframework.boot.CommandLineRunner + Thread.currentThread (). join ()을 사용하여 해결책을 찾았습니다. 예 : (참고 : 아래 코드는 Java가 아닌 Groovy에 있습니다.)

    package id.ac.itb.lumen.social
    
    import org.slf4j.LoggerFactory
    import org.springframework.boot.CommandLineRunner
    import org.springframework.boot.SpringApplication
    import org.springframework.boot.autoconfigure.SpringBootApplication
    
    @SpringBootApplication
    class LumenSocialApplication implements CommandLineRunner {
    
        private static final log = LoggerFactory.getLogger(LumenSocialApplication.class)
    
        static void main(String[] args) {
            SpringApplication.run LumenSocialApplication, args
        }
    
        @Override
        void run(String... args) throws Exception {
            log.info('Joining thread, you can press Ctrl+C to shutdown application')
            Thread.currentThread().join()
        }
    }
    
  3. ==============================

    3.CountDownLatch를 사용한 예제 구현 :

    CountDownLatch를 사용한 예제 구현 :

    @Bean
    public CountDownLatch closeLatch() {
        return new CountDownLatch(1);
    }
    
    public static void main(String... args) throws InterruptedException {
        ApplicationContext ctx = SpringApplication.run(MyApp.class, args);  
    
        final CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                closeLatch.countDown();
            }
        });
        closeLatch.await();
    }
    

    이제 응용 프로그램을 중지하려면 프로세스 ID를 검색하고 콘솔에서 kill 명령을 실행하십시오.

    kill <PID>
    
  4. ==============================

    4.Spring Boot는 응용 프로그램이 실행되는 작업을 응용 프로그램이 구현 된 프로토콜에 맡깁니다. 예를 들어이 가이드를 참조하십시오.

    Spring Boot는 응용 프로그램이 실행되는 작업을 응용 프로그램이 구현 된 프로토콜에 맡깁니다. 예를 들어이 가이드를 참조하십시오.

    예를 들어, Camel 서비스를 실행하는 방법은 Camel을 기본 Spring Boot 응용 프로그램 클래스에서 독립 실행 형 응용 프로그램으로 실행하는 것입니다.

  5. ==============================

    5.내 프로젝트는 NON WEB Spring Boot입니다. 내 우아한 솔루션 CommandLineRunner에 의해 데몬 스레드를 만드는 것입니다. 그런 다음 응용 프로그램이 즉시 종료되지 않습니다.

    내 프로젝트는 NON WEB Spring Boot입니다. 내 우아한 솔루션 CommandLineRunner에 의해 데몬 스레드를 만드는 것입니다. 그런 다음 응용 프로그램이 즉시 종료되지 않습니다.

     @Bean
        public CommandLineRunner deQueue() {
            return args -> {
                Thread daemonThread;
                consumer.connect(3);
                daemonThread = new Thread(() -> {`enter code here`
                    try {
                        consumer.work();
                    } catch (InterruptedException e) {
                        logger.info("daemon thread is interrupted", e);
                    }
                });
                daemonThread.setDaemon(true);
                daemonThread.start();
            };
        }
    
  6. ==============================

    6.웹 응용 프로그램을 배포하지 않을 때 Java 프로세스를 유지하려면 webEnvironment 속성을 false로 설정합니다.

    웹 응용 프로그램을 배포하지 않을 때 Java 프로세스를 유지하려면 webEnvironment 속성을 false로 설정합니다.

     SpringApplication sa = new SpringApplication();
     sa.setWebEnvironment(false); //important
     ApplicationContext ctx = sa.run(ApplicationMain.class, args);
    
  7. ==============================

    7.스프링 부팅 응용 프로그램을 계속 실행하려면 컨테이너에서 실행해야합니다. 그렇지 않으면 모든 Java 응용 프로그램과 마찬가지로 모든 스레드가 완료됩니다. 추가 할 수 있습니다.

    스프링 부팅 응용 프로그램을 계속 실행하려면 컨테이너에서 실행해야합니다. 그렇지 않으면 모든 Java 응용 프로그램과 마찬가지로 모든 스레드가 완료됩니다. 추가 할 수 있습니다.

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    

    그리고 그것은 webapp로 바꿀 것입니다, 그렇지 않다면 당신은 당신의 구현에서 그것을 유지할 책임이 있습니다

  8. from https://stackoverflow.com/questions/28017784/how-to-prevent-spring-boot-daemon-server-application-from-closing-shutting-down by cc-by-sa and MIT license