应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Spring容器关闭执行销毁方法有几种?

  什么是Spring的扩展点?
  这个问题让我很深刻,记得之前有一个面试就被问到有没有使用过。
  那他是什么?
  先来看下Spring容器的加载过程
  可以看到Bean从无到有主要是经历了四个步骤
  就是在成熟态的时候,在初始化生命周期执行回调方法
  主要是以接口或者注解的形式对外提供,注入到IOC容器中,完成对应的功能。哪些场景下,我们需要使用退出前销毁
  主要是希望在销毁之前在做一些事情,比如像池化技术正确的断开,JVM内存回收,还有业务逻辑执行。业务场景
  直接进入正题,我先说一说我的业务场景,在执行任务A的时候,这时候服务重启了,因为任务A加了分布式锁,所以在
  重启服务的时候,补偿机制拿到了任务A发现锁依然被占用着,所以我就希望能够在应用关闭之前把锁给释放掉,减少
  对补偿机制的影响。
  补充:这里其实也可以用Redisson,来进行锁续期,一段时间过后自己释放,但是系统中更多时候使用简单的分布式
  锁就可以满足,避免引入Redisson这么重的框架。解决方案将当前执行任务的redis锁记录下来在Spring应用关系的时候,调用销毁方法进行锁的释放采用SmartLifecycle和DisposableBean相互配合来执行destroy()方法
  具体实现:ServicepublicclassUserServiceImplimplementsUserService,DisposableBean,SmartLifecycle{privatevolatilebooleanrunningfalse;privateListStringlockKeysnewArrayList();ResourceHelloServicehelloService;Overridepublicvoidget(){Stringkeyredis:key;伪代码RedissonUtil。lock(key);try{lockKeys。add(key);}catch(Exceptionex){ex。printStackTrace();。。。}finally{RedissonUtil。unlock(key);lockKeys。remove(key);}}Overridepublicvoiddestroy(){删除正在执行中的keyRedissonUtil。deletes(lockKeys);runningfalse;}Overridepublicvoidstart(){System。out。println(start);runningtrue;}Overridepublicvoidstop(){System。out。println(stop);删除正在执行中的keyRedissonUtil。deletes(lockKeys);}OverridepublicbooleanisRunning(){returnrunning;}OverridepublicintgetPhase(){returnInteger。MAXVALUE;}}复制代码
  利用DisposableBean和SmartLifecycle进行双重的销毁机制,如果已经执行了DisposableBean的销毁方法
  那可以修改running的值为false,就不会再进行stop()的执行了Spring执行关闭的时机JVM关闭对象销毁时候容器停止关闭前执行销毁方法有哪些DisposableBean
  调用时机:Bean对象销毁的时候ServicepublicclassUserServiceImplimplementsUserService,DisposableBean{Overridepublicvoiddestroy(){System。out。println(destroy);}}复制代码SmartLifecycle
  调用时机:Spring容器发出关闭通知ServicepublicclassUserServiceImplimplementsUserService,SmartLifecycle{Overridepublicvoidstart(){System。out。println(start);runningtrue;}Overridepublicvoidstop(){System。out。println(stop);}OverridepublicbooleanisRunning(){returnrunning;}OverridepublicintgetPhase(){returnInteger。MAXVALUE;}}复制代码InitializingBean
  这个方式比较特殊,就是在初始化的时候,提前设置好了钩子函数addShutdownHook
  调用时机:监听到JVM关闭ServicepublicclassUserServiceImplimplementsUserService,InitializingBean{OverridepublicvoidafterPropertiesSet(){Runtime。getRuntime()。addShutdownHook(newThread((){helloService。get();System。out。println(addShutdownHook);}));}}复制代码PreDestroy注解PreDestroypublicvoidpreDestroy(){System。out。println(PreDestroy);}复制代码Xml和Bean绑定destoryMethod方法
  对比执行结果:
  SmartLifecyclePreDestroy,DisposableBeanaddShutdownHook2022090523:06:04。046INFO11807〔main〕c。l。d。SpringBootDemoDockerApplication:StartedSpringBootDemoDockerApplicationin1。4seconds(JVMrunningfor1。752)ApplicationRunnerCommandLineRunner项目启动完毕后,倒数10秒关闭thread1。。。thread1。。。thread1。。。thread1。。。stop2022090523:06:14。054INFO11807〔main〕o。s。s。concurrent。ThreadPoolTaskExecutor:ShuttingdownExecutorServiceapplicationTaskExecutorPreDestroydestroythread1。。。thread1。。。getaddShutdownHook复制代码SmartLifecycle接口源码
  了解一下SmartLifecycle接口到底由哪些组成的当上下文被刷新(所有对象已被实例化和初始化之后)时,将调用该方法isAutoStartup默认为true则调用start,否则需要自己手动调用Overridepublicvoidstart(){System。out。println(start);runningtrue;}接口Lifecycle子类的方法,只有非SmartLifecycle的子类才会执行该方法。1。该方法只对直接实现接口Lifecycle的类才起作用,对实现SmartLifecycle接口的类无效。2。方法stop()和方法stop(Runnablecallback)的区别只在于,后者是SmartLifecycle子类的专属。Overridepublicvoidstop(){System。out。println(stop);}只有该方法返回false时,start方法才会被执行只有该方法返回true时,stop(Runnablecallback)或stop()方法才会被执returnOverridepublicbooleanisRunning(){returnrunning;}返回Integer。MAXVALUE仅表明我们将是第一个关闭的bean和最后一个启动的bean关闭容器的第一时间调用stop()方法OverridepublicintgetPhase(){returnInteger。MAXVALUE;}如果该Lifecycle类所在的上下文在调用refresh时,希望能够自己自动进行回调,则返回true,false的值表明组件打算通过显式的start()调用来启动,类似于普通的Lifecycle实现。OverridepublicbooleanisAutoStartup(){returnfalse;}SmartLifecycle子类的才有的方法,当isRunning方法返回true时,该方法才会被调用。很多框架中的源码中,都会把真正逻辑写在stop()方法内。Overridepublicvoidstop(Runnablecallback){stop();如果你让isRunning返回true,需要执行stop这个方法在程序退出时,Spring的DefaultLifecycleProcessor会认为这个MySmartLifecycle没有stop完成,程序会一直卡着结束不了,等待一定时间(默认超时时间30秒)后才会自动结束。callback。run();}复制代码
  SmartLifecycleisRunning判断是否已经执行,false表示还未执行
  则调用SmartLifecyclestart()执行
  当关闭的时候isRunning为ture已经执行
  则调用SmartLifecyclestop()执行学习MQ如何进行退出前优雅执行销毁方法
  DefaultRocketMQListenerContainer。classpublicclassDefaultRocketMQListenerContainerimplementsInitializingBean,RocketMQListenerContainer,SmartLifecycle,ApplicationContextAware{privatefinalstaticLoggerlogLoggerFactory。getLogger(DefaultRocketMQListenerContainer。class);privatebooleanrunning;。。。Overridepublicvoiddestroy(){this。setRunning(false);if(Objects。nonNull(consumer)){consumer。shutdown();}log。info(containerdestroyed,{},this。toString());}OverridepublicbooleanisAutoStartup(){returntrue;}Overridepublicvoidstop(Runnablecallback){stop();callback。run();}Overridepublicvoidstart(){if(this。isRunning()){thrownewIllegalStateException(containeralreadyrunning。this。toString());}try{consumer。start();}catch(MQClientExceptione){thrownewIllegalStateException(FailedtostartRocketMQpushconsumer,e);}this。setRunning(true);log。info(runningcontainer:{},this。toString());}Overridepublicvoidstop(){if(this。isRunning()){if(Objects。nonNull(consumer)){consumer。shutdown();}setRunning(false);}}OverridepublicbooleanisRunning(){returnrunning;}privatevoidsetRunning(booleanrunning){this。runningrunning;}OverridepublicintgetPhase(){ReturningInteger。MAXVALUEonlysuggeststhatwewillbethefirstbeantoshutdownandlastbeantostartreturnInteger。MAXVALUE;}OverridepublicvoidafterPropertiesSet()throwsException{initRocketMQPushConsumer();this。messageTypegetMessageType();this。methodParametergetMethodParameter();log。debug(RocketMQmessageType:{},messageType);}}复制代码
  RocketMQ在这里进行了几个步骤需要我们关注他将getPhase的值设置为最大,在容器关闭的第一时间调用stop()方法同时实现了SmartLifecycle和RocketMQListenerContainer接口,分别实现了stop()和destroy()方法,进行双重关闭,如果和destroy()先执行了,则将running设置为false,不再执行stop()
  原文链接:https:juejin。cnpost7139920679683489823

王祖贤为什么退出娱乐圈了?王祖贤为什么退出娱乐圈了?王祖贤退出娱乐圈主要有两方面原因,一个原因是被情所伤;另外一个原因是王祖贤的性格比较随性洒脱,想过闲云野鹤的生活!王祖贤简介1967年,王……如何推动青年人就业?人社部答红星新闻简化就业手续,延长落户办今年青年失业率一直居高不下,同时高校毕业生人数再创新高。那么,人社部在推动高校毕业生等青年人就业方面做了哪些工作?下一步会有哪些安排和部署?8月25日,中宣部召开中国这十……经常嗳气怎么办?找准原因再治疗嗳气俗称打饱嗝,是充盈于胃内的气体由于胃逆蠕动、贲门开放,突然经口排出所致,为消化系统常见的症状之一。嗳气常源于进食产气食物或者吞气症(无意识的吞咽空气),也可因消化道病……2011年,侯耀文骨灰安放仪式2011年春天,在骨灰墙上安放了长达45个月的侯耀文的骨灰终于得以入土。当天上午十点安葬仪式在昌平的一座陵园举行。在听到这个消息之后,不少曾经深深为侯耀文的艺术魅力而吸引的朋友……ampampquot情感导师ampampquot涂磊本该前途屡出金句的情感导师涂磊曾言:温柔的拒绝远胜于严厉的苛责。意思是在不违背自身意愿的情况下,尽可能用婉转的语气,诚恳地给出建议使人信服。但在某次带货直播中,涂磊的所作所……philink斐讯运动复活攻略philink斐讯运动是一款运动软件,软件跟斐讯穿戴设备一起使用,通过两者结合,可以检测到身体健康数据,例如睡眠时间是多久、心率等等,而且还能检测到用户们每天的运动轨迹,能给用……雅尼斯新消息!大概率留在CBA或将重新证明自己北京时间4月8日,在北京首钢惨被吉林男篮之后,北京首钢完成了季后赛一轮游!赛后,雅尼斯主动承担了输球的责任,成为了背锅侠,火速宣告辞职!尽管雅尼斯在执教北京首钢过程中,带队成绩……赵丽颖冯绍峰离婚早有预兆,对方婚后死性不改,彻底看清渣男本质赵丽颖嫁给冯绍峰之前是笑容满面,像一朵小花,但是嫁给冯绍峰之后他却是发生了很大的改变,表情冷漠,没有笑容,赵丽颖在那几年里到底经历了什么?赵丽颖和冯绍峰结婚是被网友不被看……326783!利拉德真被打哭了,天知道他失去了什么马刺103113鹈鹕马达,你知道最后4分多钟的时候,本宫有多紧张吗?生怕被逆转了,这特么被逆转了我的文章可怎么办啊!!!鹈鹕啊!还真不愧是鹈鹕!不得不说今天鹈……十四五期间培育1000家国家级生态农场!浅析生态农场的落地可乡村旅游业的蓬勃发展,使得相关行业成为当地新的经济增长点,而为了避免发展同质化的问题,集观光旅游、有机农业等功能为一体的生态农场,逐渐成为了众多企业和创业者的发展目标。2022……电子烟出海大潮从制造出口到品牌出口,行业已现两极分化电子烟。图ICphoto海外市场现在呈蓝海趋势,公司未来方向肯定会向海外偏移。7月11日,在国内经营着一家电子烟品牌的张雷告诉新京报贝壳财经记者,一年前,自觉国内机会不大……神秘可爱的中亚大国哈萨克斯坦风景治愈哈萨克斯坦是横跨亚欧两洲的国家,国土包括中亚北部和东欧的东南部,国土面积相当庞大,位居世界第九位。境内四季均有郁金香开放,因此郁金香是他们的国花,首都为阿斯……
白露一碗汤,不用医生帮!6碗汤常喝,补水又润燥,健康过秋白露一碗汤,不用医生帮!6碗汤常喝,补水又润燥,健康过秋天,老少皆宜24节气里的白露即将在9月7号来到,它的到来,意味着秋天彻底进入,天气逐渐变凉,丰收时节也来了。……拇指包太阳蛋铁盒冰粉半个川渝火锅圈都在卖鲜气十足的牛肉花蛋卷、美得像艺术品的星空虾滑、火到国外的拇指生煎包最近,餐见君又发现了许多潜力新品,并且观察到它们呈现出4大趋势!第1185期文文博鲜依……日系风格的二次元卡牌对战游戏推荐需要慢慢养成的卡牌游戏日系风格的二次元卡牌对战游戏是很多的玩家很喜欢的游戏的类型之一,在日系风格的二次元卡牌对战游戏玩家可以体会到不同的乐趣,下面小编就来介绍几款好玩的日系风格的二次元卡牌对战游戏,……经武快评日逾千点的反弹,展现中国经济韧性湖南日报全媒体评论员杨兴东在连续走弱多日后,人民币兑美元汇率强势反弹。10月26日,在岸、离岸人民币兑美元双双大幅回升,较日内低点均反弹逾千点。罕见的单日涨幅,给连续一段……不需要营销的老店,招牌菜被我学来了!一卷一煮2步搞定秋日生活打卡季论人类的逆反心有多强。餐厅食肆大开时,也没有要出去吃的欲望。可一旦不让堂食,全身心渴望外面的食物。尤其是广州落雨降温,走在路上,就更想冲进……早安日历每日一签11182022年11月18日,星期五,农历十月廿五,立冬第十二天。愿你做一个有趣的人,把简单的日子过得繁花似锦,把平淡的生活过得丰富多彩。生活既有繁杂的琐事,也有美妙的热……从MadeinChina到CreatedinChina,李佳盘口、流苏、交领,今年夏天刮来一阵新中式风,这阵风吹来的,其实是与中国人血脉相融的中华传统文化。在过去很长一段时间里,衣服内侧MadeinChina的标签是它产自中国的证……华尔街大行坚定看多!高盛增持中国股票更加青睐A股财联社10月18日讯(编辑刘蕊)美东时间周一,华尔街大行高盛明确表达对中国股票前景的看好。高盛集团分析师表示,投资者应该卖出标普500指数看涨期权,同时买入恒生中国企业指……200亿龙头宣布涨价!股价提前大涨中国基金报记者忆山年内顺鑫农业再次对白酒产品提价!双十一当日,顺鑫农业发布公告,宣布将于明年1月1日开始,上调5款牛栏山陈酿价格。公开资料显示,目前顺鑫农业业……黄瓜我家从不凉拌,教你最解馋的吃法,比肉还香,开胃下饭又解馋国以民为本,民以食为天,各位老饕大家好!大家都知道,黄瓜的含水量高,既能当水果吃,又能当蔬菜食用,是个很受大众欢迎的食物。今天,我要教大家用黄瓜做个酸辣可口,开胃下饭的小菜,而……苹果申请注册灵动岛商标【环球网科技综合报道】据悉,日前苹果公司申请注册了多个灵动岛DYNAMICISLAND商标,以及光像引擎ACTIONMODEA16BIONIC等商标,国际分类包括科学仪器、网站……抄书的第78天,孩子有虫牙了怎么办养儿一百岁,母忧九十九。每个孩子健康平安长大的背后都有一个人的付出,而在中国的国情里,这个人多半是母亲。关于虫牙这个问题,已经是老生常谈了。我以前上学时就有一个女同学的牙……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网