使用Spring 3.0.5 GA

使用@PreDestroy方法拥有一个 session 范围的bean。只是注意到,如果拥有HttpSession超时(即,超出Servlet容器的 session 超时值),则会发出@PreDestroy回调。但是,如果我只是关闭应用程序服务器,则不会调用@PreDestroy。这是设计使然还是错误?如果是后者,有什么解决方法的建议吗?

FWIW,在两种情况下都调用单例bean上的@PreDestroy。

谢谢,
-尼基塔

PS。有一个可能与之相关的Spring bug - SPR-7359

最佳答案

有趣的。 session 范围关闭的事件发生时, session 范围的Bean会调用其@Predestroy。如果容器从不发送该事件,则不会通知Spring。我不确定这是否构成错误,如果是这样,请确定这是Spring还是Tomcat中的错误。后者似乎更有可能,但是我不知道Servlet容器是否必须这样做。

如果这是您的首选,那么您可能要考虑让有作用域的bean在其@PostConstruct期间向“registrar”单例注册,并在@PreDestroy上取消注册。如果注册商关闭,它可以将该事件传播到仍在其注册的任何剩余的 session 范围的Bean。

不理想,但务实的解决方案。

10-07 12:03