5

Per Spring's documentation here, I added a shutdown hook:

SpringApplication app = new SpringApplication(App.class);
DefaultProfileUtil.addDefaultProfile(app);
appContext = app.run(args);
appContext.registerShutdownHook();

However the @PreDestroy method does not get called if the application is killed after starting.

import org.springframework.stereotype.Service;
import javax.annotation.PreDestroy;
import javax.annotation.PostConstruct;
@Service
public class Processor {
  public Processor() {
    ...
  }
  @PostConstruct
  public void init() {
    System.err.println("processor started");
  }
  //not called reliably
  @PreDestroy
  public void shutdown() {
    System.err.println("starting shutdown");
    try {Thread.sleep(1000*10);} catch (InterruptedException e) {e.printStackTrace();}
    System.err.println("shutdown completed properly");
  }
}

All I ever see is processor started...

processor started

^C

If I wait at least 30 seconds for spring to complete starting up, and THEN kill the process, then the @PreDestroy annotated function does get called.

processor started
[...]
2018-12-26 17:01:09.050  INFO 31398 --- [  restartedMain] c.App                                    : Started App in 67.555 seconds (JVM running for 69.338)
2018-12-26 17:01:09.111  INFO 31398 --- [  restartedMain] c.App                                    :
----------------------------------------------------------
        Application 'App' is running! Access URLs:
        Local:          http://localhost:8081
        External:       http://10.10.7.29:8081
        Profile(s):     [dev]
----------------------------------------------------------
2018-12-26 17:01:09.111  INFO 31398 --- [  restartedMain] c.app                                    :
----------------------------------------------------------
^Cstarting shutdown
shutdown completed properly

How do I determine when it is safe to depend on the calling of all @PreDestroy annotated functions?

I know how to register a shutdown hook with the JVM and that is what I am currently doing, however it seems to me that @PreDestroy should be doing that.

By "safe to depend on" I am assuming a normal shutdown sequence (i.e. requested by SIGTERM or SIGINT) and not power outages and killing the process, etc.

Dovmo
  • 8,121
  • 3
  • 30
  • 44
user3338098
  • 907
  • 1
  • 17
  • 38

0 Answers0