我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何解决Rocketmq停机

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何解决Rocketmq停机

如何解决Rocketmq停机,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1

时间追溯到2018年12月的某一天夜晚,那天我正准备上线一个需求完就回家,刚点下发布按钮,告警就响起,我擦,难道回不了家了?看着报错量只有一两个,断定只是偶发,稳住不要慌。

把剩下的机器发完,又出现了几个同样的错误,作为一名优(咸)秀(鱼)程序员,这种问题必须追查到底。

如何解决Rocketmq停机

2

娴熟地查询到报错日志

org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.DataSourceClosedException: dataSource already closed

看着异常信息,陷入了沉思

如何解决Rocketmq停机

表面上看报错是因为使用了已经关闭的数据源

数据源什么时候会关闭呢?只有进程被杀死的时候

莫非是应用关闭时不够平滑?发布时会先摘除流量的呀,应该不至于呀

天色已经很晚,漫无目的地拖动日志,疲惫地寻找新线索,突然报错日志中一个单词引入眼帘:「rocketmq」

精神抖擞,大概知道原因了,这应用中还有个兢兢业业的rocketmq  consumer一直在消费消息,在应用关闭时,外部流量被摘除了,但没人通知rocketmq consumer,于是它抛异常了。

如何解决Rocketmq停机

3

出于我对rocketmq不深刻甚至有点肤浅的理解,它的消费采用ack的方式,如果报错,消息稍后还会重试,不会丢消息,而且如果消费代码是幂等的,也不会有业务上的异常,总之这不重要,因为它也不是我写的代码。

瞅了一眼consumer的代码(这里就不贴代码了,反正贴了你也不会看),consumer注册了一个ShutdownHook,ShutdownHook里consumer执行了shutdown来优雅地退出,并且给这个shutdownThread设置了最高优先级,然而从实践看来,这个线程最高优先级并没有什么卵用。

而且从《ShutdownHook原理》这篇文章中也知道ShutdownHook是并发执行的,spring容器关闭也是一个ShutdownHook,他们之前没有先后顺序。

了解原因后,第一时间想到了类似dubbo摘流的方案,吭哧吭哧写了个优雅关闭rocketmq  cosnumer的接口,在应用关闭脚本的kill之前调用该接口,完美解决问题,赶紧下班回家,不然要猝死了。

4

夜里入睡,梦到老板让我把所有的系统都改造掉,吓得我一机灵。

于是第二天又重新思考这个问题,总觉得在应用里实现一个接口并在stop脚本中去调用是一件非常不优雅的事,更重要的是这也没法复制到其他项目,我又陷入了沉思。

既然是spring容器关闭时bean的销毁顺序导致的问题,那么能不能利用spring的depend-on把顺序理顺了?说干就干。

起初我遇到是这样的依赖关系:

如何解决Rocketmq停机

手把手在xml的每个bean中把depend-on关系都配上,似乎也起到了作用。

但当我打开第二个项目时,它的bean之间的依赖关系大致如下:

如何解决Rocketmq停机

好家伙,26个字母差点不够用,当时我的心情是这样的

所以我觉得以当前的速度,改造完所有项目可能都到9102年了。

5

又过了一段时间,在github交友网站上突然看到了rocketmq官方实现的spring-boot-starter,于是点进去看了它的实现。好家伙,看完直呼666。

官方starter实现了spring的SmartLifecycle接口,它的start方法能在所有bean初始化完成后被调用,stop方法会在bean被销毁前调用,对rocketmq  consumer来说简直完美。

顺便还复习了一下spring容器的关闭,代码在AbstractApplicationContext的doClose方法,这里我总结成一幅图:

如何解决Rocketmq停机

通过上图能看到,销毁bean之前,有关闭lifecycle  bean和发送ContextClosedEvent两个动作,官方starter选择了实现LifeCycle接口的方式。

6

到这里我该给老板汇报去了,之所以rocketmq  consumer发布时不平滑是我们的使用姿势问题,虽然对业务没影响,但不优雅,解决方案有两个,老板你选吧:

  • 全都换成官方starter,依赖spring-boot,官方维护,改造成本很高,

  • 监听ContextClosedEvent来实现优雅关闭,这块可以封装一下,让业务方引入依赖即可

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何解决Rocketmq停机

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

win10开机停在鼠标黑屏如何解决

本篇内容介绍了“win10开机停在鼠标黑屏如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!win10开机停在鼠标解决方法:1、按下“w
2023-07-01

如何解决springboot集成rocketmq关于tag的坑

这篇文章给大家分享的是有关如何解决springboot集成rocketmq关于tag的坑的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。新项目使用springboot的若依框架集成rocketmq,选择集成Rock
2023-06-20

如何解决SpringBoot整合RocketMQ遇到的问题

本篇内容主要讲解“如何解决SpringBoot整合RocketMQ遇到的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决SpringBoot整合RocketMQ遇到的问题”吧!应用场景
2023-06-20

windows停止工作如何解决

当Windows停止工作时,您可以尝试以下方法来解决问题:1. 重新启动电脑:有时候只需简单地重新启动计算机即可解决问题。2. 更新驱动程序:有时驱动程序过时或损坏可能导致Windows停止工作。您可以通过访问硬件制造商的网站来获取最新的驱
2023-10-20

android停止运行如何解决

当Android应用程序停止运行时,可能有几种原因。以下是一些常见的解决方法:1. 重新启动设备:有时,设备可能出现问题导致应用程序停止运行。尝试重新启动设备可以清除任何临时问题并解决运行问题。2. 清除应用程序缓存:应用程序缓存可能会导致
2023-08-23

win10账户被停用如何解决

这篇文章主要讲解了“win10账户被停用如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“win10账户被停用如何解决”吧!win10账户被停用解决方法1、首先在桌面找到此电脑,鼠标右键
2023-06-30

sql server停止服务如何解决

要停止 SQL Server 服务,可以按照以下步骤进行操作:1. 打开 SQL Server Configuration Manager。可以在开始菜单中搜索“SQL Server Configuration Manager”来找到并打开
2023-09-05

windows imazing停止工作如何解决

这篇文章主要讲解了“windows imazing停止工作如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“windows imazing停止工作如何解决”吧!imazing停止工作解决
2023-07-01

android被停止运行如何解决

当Android应用程序被停止运行时,以下是一些可能的解决方案:1. 重新启动设备:有时候,重新启动设备可以解决一些应用程序停止运行的问题。2. 清除应用程序缓存:在设备的“设置”中找到应用程序管理器,选择要解决问题的应用程序,然后点击“清
2023-08-19

Win7系统 开机提示catalyst control center已停止如何解决

Win7系统深受广大群众的喜爱,成为最受欢迎系统之一。即使在完美的系统在使用过程中难免遇到一些故障问题,最近有用户反馈每次开机的时候都编程客栈会弹出一个catalyst control center:monitoring program停止
2023-06-13

win11屏幕狂闪不停如何解决

本篇内容主要讲解“win11屏幕狂闪不停如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win11屏幕狂闪不停如何解决”吧!方法一:1、首先我们按下键盘“win+r”打开运行,输入“ser
2023-07-01

android process已停止运行如何解决

要解决Android进程停止运行的问题,可以尝试以下几种方法:1. 重新启动设备:有时候只需简单地重新启动设备,问题就能解决。2. 清除应用缓存:打开设备的设置,找到应用管理器或应用列表,选择出现问题的应用,然后清除缓存。3. 更新或卸载应
2023-10-08

电脑风扇转一下就停开不了机如何解决

这篇文章主要讲解了“电脑风扇转一下就停开不了机如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“电脑风扇转一下就停开不了机如何解决”吧!电脑风扇转一下就停开不了机原因及解决方法:一、内存
2023-07-01

电脑屏幕闪烁不停如何解决

本篇内容主要讲解“电脑屏幕闪烁不停如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“电脑屏幕闪烁不停如何解决”吧!方法一、检查刷新率设置1、鼠标右键单击系统桌面的空白区域,从弹出的右键菜单中
2023-06-27

win10更新100%不停转圈如何解决

如果Windows 10更新在100%处停留并不停转圈,可能会有几种解决方法:1. 等待一段时间:有时候,更新可能需要更长的时间来完成。建议耐心等待30分钟至1小时,看看是否有任何进展。2. 重启计算机:尝试按下计算机的电源按钮,将其关闭,
2023-08-30

win7电脑用户被停用如何解决

这篇文章主要讲解了“win7电脑用户被停用如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“win7电脑用户被停用如何解决”吧!win7电脑用户被停用解决方法1.重启计算机,在开机界面出
2023-06-27

windows internet explorer已停止工作如何解决

本篇内容介绍了“windows internet explorer已停止工作如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!inter
2023-07-01

win7 internet explorer已停止工作如何解决

本篇内容介绍了“win7 internet explorer已停止工作如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、首先点击左下
2023-07-02

编程热搜

目录