9

I have a spring application which is not calling bean destroy methods on shutdown. I've seen references to this being due to instantiation in a beanRefFactory, and that this can be circumvented through manually calling registerShutdownHook() on an the application context.This method seems to have disappeared from spring between versions 2.0 - 2.5.

Can someone point me in the direction of how this is now done?

Thanks.

Steve B.
  • 52,726
  • 11
  • 92
  • 128

2 Answers2

17

This method is still available in ConfigurableApplicationContext and implemented by AbstractApplicationContext.

So you might be able to do this

ApplicationContext ctx = ...;
if (ctx instanceof ConfigurableApplicationContext) {
    ((ConfigurableApplicationContext)ctx).registerShutdownHook();
}

Alternatively, you could simply call ((ConfigurableApplicationContext)ctx).close() yourself while closing down the application or using your own shutdown hook:

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run(){
       if (ctx instanceof ConfigurableApplicationContext) {
           ((ConfigurableApplicationContext)ctx).close();
       }
    }
 });
sfussenegger
  • 34,561
  • 14
  • 93
  • 118
0

So many upvotes, but the second statement is totally wrong, a system.exit in java would terminate the spring before ever getting to your shutdownhook, the right way to go are these 4 ways

1 InitializingBean and DisposableBean callback interfaces 2 Other Aware interfaces for specific behavior 3 custom init() and destroy() methods in bean configuration file 4 @PostConstruct and @PreDestroy annotations

Click here!

MRK187
  • 1,445
  • 2
  • 13
  • 19