2017-04-13 3594 views
4

我是Spring Boot的新手,我有一個Spring Boot應用程序,似乎忽略了@PreDestroy註釋 - 當我從命令行或通過Eclipse運行時,我是從未看到@PreDestroy代碼正在運行時應用程序是關斷(例如,經由CTRL-C)Spring Boot @PreDestroy註解不起作用

代碼如下...

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註釋在方法上用作回調通知,表明實例正在** ** ** ** **中被移除的過程中,它不是您的應用程序的預關閉 –

+0

因此在運行的應用程序中使用ctrl-c或kill 時,@PreDestroy不會啓動?有什麼我可以趕上這個事件? – finbin

+0

看看這個問題http://stackoverflow.com/questions/23936162/register-shutdownhook-in-web-application –

回答

1
彈簧

引導寄存器關閉掛鉤看到org.springframework.context.support.AbstractApplicationContext#registerShutdownHook方法。 因爲結果上下文必須關閉crtl + c組合(如果您通過java -jar app.jar cmd運行您的應用程序),然後觸發您的@Predestroy方法。這對我有用。

我在代碼中看不到任何評論。我可以建議使用@Component註釋而不是手動@Bean聲明註釋您的MessageProcessorImpl bean。

相關問題