我的spring上下文中有一个单例bean(称之为“beanX'”),当启动时会旋转其他一些线程并在文件系统上创建一些状态。 所以我想以干净的方式停止它,以便在关闭上下文时释放资源。
我已使用@Bean(destroyMethod = "shutdown")
对其进行了注释,并且按预期正常运行,没有任何问题。
进一步的信息是这个bean在上下文启动序列中很早就加载了(因为它有很多其他直接和间接使用它的bean),还有很多其他的bean在它之后加载。
现在解决这个问题:当我们进行开发时,其中一个bean无法启动并使spring上下文的启动失败 - 这是很常见的 - 但在这些情况下,beanX没有正确关闭。
这对于' productionCode'因为这通常意味着整个jvm停止然后资源被清理 - 但是当我们运行我们的1000+单元测试套件(并且一些测试有导致上下文崩溃的错误)时这变成了一个真正的问题因为测试JVM在测试之间没有停止,并且在每次失败的测试之后都会创建一个新的spring上下文 - 即使失败的测试在beanX启动之后没有正确清理但从未停止过!
今天,当我运行测试套件时,我的笔记本电脑创建了500万个文件句柄和13k个线程。
所以,我们目前唯一的方法就是让beanX成为一个公共静态字段(ClassX.beanX),它由spring上下文懒得初始化 - 然后在我们的测试代码中手动调用ClassX.beanX。 shutdown()如果发生任何上下文加载错误。
但我很好奇是否有更好/不同的春天'这样做的方法?
答案 0 :(得分:0)
您可以在Spring中使用事件处理。
ApplicationContext中的事件处理是通过 ApplicationEvent类和ApplicationListener接口。 如果是豆 实现 ApplicationListener 接口的部署到 上下文,每次将ApplicationEvent发布到 ApplicationContext,通知bean 。从本质上讲,这是 标准观察者设计模式。