当前位置 :首页 >> 时尚

Spring正确关闭线程水姿势——优雅停机

2023-04-28   来源 : 时尚

执行,按一定Hz将数据从DB加载到Cache中都

例如:

1、每100ms向寄存器出水口里扔一个执行

2、执行是:从DB中都放到数据,填入缓存(例如Local Cache,Redis)

在Spring Shutdown Hook监督期间,新的执行无论如何才会转化成,又或者旧的执行从未监督天内,一旦为了让受益DB天然资源,就似乎由于天然资源被可回收而受益失败,弹出极其

此时的系统停止使用仍然不朴素—执行监督有极其,这种极其似乎对业务有损,我们不宜尽量避免十分相似疑虑的转化成,而不是抱着"算了吧,当真转化成这个疑虑的期望值很低",或者"算了吧,当真极其对我目年前业务负面影响也很大"的态度,这是技术人的基本修养,也是对自我提高的拒绝—目年前业务负面影响很大,允许不不宜解决,但是期望掌握一种技术细节,有朝一日有一天如果碰到了对业务损伤比较大的一幕。

技术细节

这个疑虑转化成的根因,是Spring Shutdown Hook与寄存器出水口里的执行都将监督,有似乎使执行依赖性的天然资源被月内可回收引致的。那么一个很直白的思维即是:在切断流量便,能否让寄存器出水口先停止使用,先监督Spring 的Shutdown Hook,避免依赖性天然资源被月内可回收?

顺着这个思维,有三个疑虑须要解决:

1、寄存器出水口如何停止使用

2、寄存器出水口如何听觉Spring Shutdown Hook马上被监督

3、如何让寄存器出水口稍晚Spring Shutdown Hook停止使用

对于第一个疑虑,本文的上一个变奏寄存器出水口正确停止使用的姿势仍然所述了技术细节:即shutdown(Now) + awaitTermination

对于第二个疑虑,Spring Shutdown Hook被诱发的时候,才会立即收到一些事件,我们只要监听这些的事件,就需要做出相不宜的反不宜

对于第三个疑虑,我们只要在这些事件的监听器中都先行将寄存器出水口停止使用,先让程序中走到接下来的停止使用流程才可

看一下Spring程式码

从上图中都可以显露,只要在destroyBeans之年前停止使用寄存器出水口才可,因此,有两种技术细节:

监听Spring的ContextClosedEvent事件,在事件被诱发时停止使用寄存器出水口付诸Lifecycle应用程序,并在其stop工具中都停止使用寄存器出水口

此处以监听ContextClosedEvent为例:

此处大家某种程度能显露一些小疑虑:须要须要行政寄存器出水口。在Spring周围环境中都,我们说是有来得多的考虑:用作Spring备有的org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor,并将下述转交Spring行政

编码如下:

节录: ThreadPoolTaskExecutor的waitForTasksToCompleteOnShutdown + awaitTerminationSeconds等于ThreadPoolExecutor的shutdown + awaitTermination,且在下定义寄存器出水口时就将朴素停止使用行为一同下定义天内,付诸了高内聚的目的

在Spring中都用作ThreadPoolTaskExecutor,来得日后捷:

不用先须要行政寄存器出水口,受益的时候也很方日后,反之亦然节录入才可

在须要停止使用的时候,反之亦然调用destroy工具才可付诸朴素停止使用

这样,Spring就才会等到寄存器出水口停止使用(超时)后,才才会接着往下监督Bean的销毁、天然资源可回收、不宜用于表达式停止使用的自然语言,年前提被依赖性天然资源一定才会被月内可回收掉

总结

本篇以两种实质一幕为例,弹出了一个很切合实质项目的疑虑:在Spring不宜用于中都如何正确地停止使用寄存器出水口。文中都仅指出,如果非正常停止使用将似乎才会转化成极其的疑虑,同时也分析了疑虑转化成的原因并所述了相不宜的技术细节。

西安妇科医院哪家治疗最好
太极集团
成都甲状腺医院
临夏哪家白癜风医院最好
昆明甲状腺医院哪家比较专业
他的白月光回家了,他却不想离婚了(先婚后爱短故事)

日子就这样相安无公事地即使如此。一天下午,我时是在自己后院弹琴,想象有些口渴,去旁边厨房挑水饮用。一走近,我就看可知陆嫡孙时是睡着楼上上。他神情有些肥...

友情链接