使用Arthas 获取Spring ApplicationContext还原问题现场
背景
最近来了个实习僧小弟,安排他实现对目标网站 连通性检测的小功能,简单讲就是将下边的shell 脚本换成Java 代码来实现
#!/bin/bash
URL="https://www.baidu"
HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`
#echo $HTTP_CODE
if [ $HTTP_CODE != '200' ];then
curl 'https://oapi.dingtalk.com/robot/send?access_token=xx' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text",
"text": {
"content": "百度平台状态不正常,请注意!"
},
"isAtAll": true
}'
fi
功能实现
使用spring task
@Scheduled(cron = "0 0 0/1 * * ? ")
public void startSchedule() {
log.info("开始执行定时任务 ,检测百度网站连通性");
try {
HttpResponse response = HttpRequest.get("").execute();
if (HttpStatus.HTTP_OK != response.getStatus()) {
this.send2DingTalk(response.getStatus());
}
log.info("请求百度成功,返回报文:{}",response.body());
} catch (HttpException e) {
log.error("请求异常百度:{}", e);
this.send2DingTalk(e.getMessage());
}
log.info("执行检测百度网站连通任务完毕");
}
问题描述
部署在服务器上,我的老jio本 都已经呼叫任务状态不正常了,可是小弟的Java 代码还是没有执行通知
- 去翻生产日志,只输入了开始并没有输出定时任务结束,感觉是哪里卡死,想当然以为如果超时总会到catch 逻辑,排查无果
- 由于任务是一小时一次,如何快速触发一下这个异常,还原事故现场
- 由于使用简单的Spring Task 没有图形化界面和API接口
Arthas 还原事故现场,重新触发任务
核心拿到 spring context 然后执行它的 startSchedule
方法
确定监控点
- SpringMVC 的请求会通过
RequestMappingHandlerAdapter
执行invokeHandlerMethod
到达目标接口上进行处理 - 而在
RequestMappingHandlerAdapter
类中有 getApplicationContext()
@Nullable
public final ApplicationContext getApplicationContext() throws IllegalStateException {
if (this.applicationContext == null && this.isContextRequired()) {
throw new IllegalStateException("ApplicationObjectSupport instance [" + this + "] does not run in an ApplicationContext");
} else {
return this.applicationContext;
}
}
- 任意执行一次请求获取到
RequestMappingHandlerAdapter
target 目标,然后执行getApplicationContext
tt命令 获取到ApplicationContext
- arthas 执行 tt
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
-
任意执行一次web 请求,tt 即可捕获
-
根据目标的索引,执行自定义 OGNL 表达式即可
tt -i 1019 -w 'target.getApplicationContext()'
使用ApplicationContext获取 定时任务bean 执行 startSchedule
tt -i 1000 -w 'target.getApplicationContext().getBean("baiduSchedule").startSchedule()'
ok 任务重新触发了
事故原因调查清楚,由于使用hutool 的工具类 没有设置timeout 导致无限等待,所以没有执行catch 逻辑
总结
- 以上吓哭实习僧的操作
禁止
生产操作,只是提供个思路 ,当然可以衍生其他业务场景的操作 - 核心是通过Arthas 来抓取Spring ApplicationContext 对象,然后获取bean 进行执行方法
- 关于Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱
- 欢迎关注我们获得更多的好玩JavaEE 实践 :

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
DevOps落地实践及案例分享
转载本文需注明出处:微信公众号EAWorld,违者必究。 引言: 银行业为了应对业务的快速变化、互联网层面不穷的业务形态和交易压力,IT“双态(或双模)化”无可避免,开始探索部分业务参考互联网的方式引入分布式架构,但对于银行业独特的强监管、高安全、强一致性的行业要求前提下,如何在业务发展、合规、IT革新之间找到平衡? 而DevOps被越来越多的金融企业所采用,来支撑软件生产过程的数字化转型,本文主要和大家分享在金融行业落地DevOps的一些坑,如何填坑以及一些心得体会!希望大家能够在自己企业中,找到适合自己企业的DevOps实践之路! 目录: 一、关于DevOps实践的一些问题 二、DevOps在金融行业落地都有哪些姿势 三、DevOps在金融行业落地的套路 四、DevOps将软件生产线数字化 五、总结一些DevOps最佳实践 六、DevOps项目落地过程中一些心得体会 1.关于DevOps实践的一些问题 来源:DevOps咖啡馆 我们从国际信息科学考试学会(EXIN)关于DevOps认证体系来分析,DevOps Pre-Master(DOPM)中包含了敏捷、精益、ITSM和测试相关的...
-
下一篇
AI中台——智能聊天机器人平台的架构与应用(分享实录)
内容来源:宜信技术学院第3期技术沙龙-线上直播|AI中台——智能聊天机器人平台 主讲人:宜信科技中心AI中台团队负责人王东 导读:随着“中台”战略的提出,目前宜信中台建设在思想理念及架构设计上都已经取得了很多成果。宜信是如何借助中台化的思想打造“AI中台”及相关的智能产品呢?本次直播,宜信科技中心AI中台团队负责人王东老师分享了宜信AI中台的具体实施路径,并重点介绍了AI中台的智能产品——智能聊天机器人平台,包括智能聊天机器人平台的背景理念、设计思想、技术架构和应用场景,该平台能提供什么样的能力,以及它如何快速地支持业务方,提供一种以中台化的思想来建设智能产品的实践思路。 视频回放:https://v.qq.com/x/page/q0904bcjlkn.html —————— 前两期技术沙龙分别分享了宜信AI中台和数据中台的建设实践,本次分享将先回顾AI中台的总体设计和实施路径,以及AI中台与数据中台的关系,再详细介绍基于中台思想建设的智能聊天机器人平台,包括其技术架构、技术原理、核心功能点、应用场景以及应用效果。 一、AI中台总体设计和实施步骤 1.1 业务演进与广泛的智能化需求 随...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- MySQL数据库在高并发下的优化方案