Java应用对象关闭注意事项

1 背景介绍

在Java应用中,日常我们关闭一个对象实例,通常采用优雅关闭的形式,当JVM退出时会调用注册的回调钩子方法来关闭对象实例,来实现资源回收。例如消息服务等。

但这种方式在复杂业务场景下可能因业务顺序导致问题。以消息服务为例,JVM执行关闭时,使用生产者对象发送消息的对象可能还在发送消息。但此时生产者对象却进行了关闭。 这导致在一定时间内一个使用者使用了关闭的对象,从而出现错误。

处理这类问题,主要搞清楚对象间的关系。 先关闭使用者、再关闭功能提供者。 从下面的依赖关系图看,就是从叶子开始向根执行关闭。

Java应用对象关闭注意事项_第1张图片

2 注意事项

  • Java应用中通常都会使用Spring来管理Bean。Spring bean的销毁顺序默认是后加载的bean先销毁,所以期望关闭的顺序,调整配置顺序,从而可以保证使用者最先被关闭,服务提供者最后被关闭。

  • 关闭服务提供者的shutdown hook,这样避免优雅关闭服务时(发送信号量关闭),服务提供者被提前关闭,导致短时间内使用服务的对象大量报错。

  • 关闭服务时,发送关闭信号,切断流量,等待一定时间,最后强制停止服务。

你可能感兴趣的:(运维)