1 背景介绍
在Java应用中,日常我们关闭一个对象实例,通常采用优雅关闭的形式,当JVM退出时会调用注册的回调钩子方法来关闭对象实例,来实现资源回收。例如消息服务等。
但这种方式在复杂业务场景下可能因业务顺序导致问题。以消息服务为例,JVM执行关闭时,使用生产者对象发送消息的对象可能还在发送消息。但此时生产者对象却进行了关闭。 这导致在一定时间内一个使用者使用了关闭的对象,从而出现错误。
处理这类问题,主要搞清楚对象间的关系。 先关闭使用者、再关闭功能提供者。 从下面的依赖关系图看,就是从叶子开始向根执行关闭。

2 注意事项
-
Java应用中通常都会使用Spring来管理Bean。Spring bean的销毁顺序默认是后加载的bean先销毁,所以期望关闭的顺序,调整配置顺序,从而可以保证使用者最先被关闭,服务提供者最后被关闭。
-
关闭服务提供者的shutdown hook,这样避免优雅关闭服务时(发送信号量关闭),服务提供者被提前关闭,导致短时间内使用服务的对象大量报错。
-
关闭服务时,发送关闭信号,切断流量,等待一定时间,最后强制停止服务。
本文探讨在Java应用中如何通过调整Spring配置确保正确关闭顺序,避免生产者在关闭时影响使用者,重点关注依赖关系管理、Springbean销毁顺序和优雅关闭策略的优化。
169万+

被折叠的 条评论
为什么被折叠?



