I'm new to Spring Boot, and I've got a Spring Boot application that seems to be ignoring the @PreDestroy annotation - when I run from command line or via Eclipse, I'm never seeing the @PreDestroy code being run when application is shutdown (e.g. via ctrl-c)
Code is below ...
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();
}
}
Message Processor Config:
@Configuration
public class MessageProcessorConfiguration {
@Bean
public MessageProcessor messageProcessor() {
return new MessageProcessorImpl();
}
}
Message Processor:
public class MessageProcessorImpl implements MessageProcessor {
@Override
public void run() {
while (isActive()) {
…
}
}
@PreDestroy
public void shutdown() {
System.out.println("MessageProcessorImpl - shutting down");
}
}
In jdk9 @PostConstruct and @PreDestroy are in java. xml. ws. annotation which is deprecated and scheduled for removal.
2. @PostConstruct. Spring calls the methods annotated with @PostConstruct only once, just after the initialization of bean properties.
The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any initialization. This method MUST be invoked before the class is put into service. This annotation MUST be supported on all classes that support dependency injection.
When we annotate a method in Spring Bean with @PostConstruct annotation, it gets executed after the spring bean is initialized. We can have only one method annotated with @PostConstruct annotation. This annotation is part of Common Annotations API and it's part of JDK module javax.
Spring Boot register shutdown hook during context creation
see org.springframework.context.support.AbstractApplicationContext#registerShutdownHook
method.
As result context must be closed on crtl+c combination (if you run your app through java -jar app.jar
cmd) and which in turn triggers your @Predestroy method. This works for me.
I don't see any remarks in your code. I can suggest annotating your MessageProcessorImpl
bean with @Component annotation instead of a manual @Bean declaration.
The @PreDestroy does not work when the Scope(value=ConfigurableBeanFactory.SCOPE_PROTOTYPE)
is used on the bean since the bean's spawned with this method is not completely managed by the IOC container.
The @PreDestroy works when the Scope(value=ConfigurableBeanFactory.SCOPE_SINGLETON)
is used on the bean.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With