2017-04-13 2 views
4

스프링 부트를 처음 접했고 @PreDestroy 주석을 무시하는 스프링 부트 응용 프로그램이 있습니다. 명령 행이나 Eclipse를 통해 실행하면스프링 부트 @PreDestroy 주석이 작동하지 않습니다.

코드는 다음과 같습니다 결코 응용 프로그램이 종료 될 때 실행되는 @PreDestroy 코드를 볼 수 없습니다 (예를 통해 CTRL-C) ...

Application.java :

@SpringBootApplication 
public class Application { 

    @Autowired 
    private MessageProcessor messageProcessor; 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @PostConstruct 
    public void init() {  
     messageProcessor.run(); 
    } 

} 

메시지 프로세서 구성 :

@Configuration 
public class MessageProcessorConfiguration { 

    @Bean 
    public MessageProcessor messageProcessor() { 
     return new MessageProcessorImpl(); 
    } 
} 

메시지 프로세서 : 컨텍스트 생성 동안

public class MessageProcessorImpl implements MessageProcessor { 

    @Override 
    public void run() { 

     while (isActive()) { 
      … 
     } 
    } 


    @PreDestroy 
    public void shutdown() { 
     System.out.println("MessageProcessorImpl - shutting down"); 
    } 

} 
+1

PreDestroy 주석은 인스턴스가 ** 컨테이너 **에 의해 ** 제거되는 ** 신호를 보내는 콜백 알림으로 메소드에 사용되며 응용 프로그램의 사전 차단 (Pre-Shuttdown)이 아닙니다. –

+0

그래서 실행중인 응용 프로그램에서 ctrl-c를 사용하거나 을 삭제하면 @PreDestroy가 실행되지 않습니까? 이 이벤트를 잡을 수있는 방법이 있습니까? – finbin

+0

이 질문을보십시오 http://stackoverflow.com/questions/23936162/register-shutdownhook-in-web-application –

답변

1

봄 부트 레지스터 종료 후크 org.springframework.context.support.AbstractApplicationContext#registerShutdownHook 방법을 참조하십시오. 결과 문맥은 java -jar app.jar cmd를 통해 앱을 실행하고 @Predestroy 메소드를 트리거하는 경우 crtl + c 조합에서 종료해야합니다. 이것은 나를 위해 작동합니다.

코드에 아무런 언급이 없습니다. 수동으로 @Bean 선언 대신 @bean에 @Component 주석으로 주석을 달 것을 제안 할 수 있습니다.

관련 문제