前言
最近上线系统重启时,报了找不到数据库连接的错误,心里万马奔腾。
问题重现
模拟线上问题,使用定时任务向线程池频繁提交数据库操作。
image.png
当应用关闭的时候,发现先把数据库连接关闭,线程池才关闭,所以导致任务执行时失败。
image.png
问题解决
控制容器Bean的关闭顺序
- 自己实现ApplicationListener
2)处理ContextClosedEvent类型事件
关闭顺序:
-
先关闭@Scheduler,停止任务提交。
由于@Scheduler的解析时通过ScheduledAnnotationBeanPostProcessor处理的,可以调用它的close方法实现。
2)停止系统中的线程池,可以shutdown后等一小会再shutdownNow,等任务执行完成。
image.png
网友评论