转载

使用Arthas 获取Spring ApplicationContext还原问题现场 原 荐

冷冷沉思录 J2EE

正文

使用Arthas 获取Spring ApplicationContext还原问题现场

使用Arthas 获取Spring ApplicationContext还原问题现场 原 荐
  冷冷gg 发布于 36分钟前

字数 734

阅读 27

收藏 0

Spring Arthas

撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>> 使用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 代码还是没有执行通知

使用Arthas 获取Spring ApplicationContext还原问题现场 原 荐

  • 去翻生产日志,只输入了开始并没有输出定时任务结束,感觉是哪里卡死,想当然以为如果超时总会到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 即可捕获

    使用Arthas 获取Spring ApplicationContext还原问题现场 原 荐
  • 根据目标的索引,执行自定义 OGNL 表达式即可

tt -i 1019 -w 'target.getApplicationContext()'

使用Arthas 获取Spring ApplicationContext还原问题现场 原 荐

使用ApplicationContext获取 定时任务bean 执行 startSchedule

tt -i 1000 -w 'target.getApplicationContext().getBean("baiduSchedule").startSchedule()'

ok 任务重新触发了

事故原因调查清楚,由于使用hutool 的工具类 没有设置timeout 导致无限等待,所以没有执行catch 逻辑

总结

  • 以上吓哭实习僧的操作 禁止 生产操作,只是提供个思路 ,当然可以衍生其他业务场景的操作
  • 核心是通过Arthas 来抓取Spring ApplicationContext 对象,然后获取bean 进行执行方法
  • 关于Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱
  • 欢迎关注我们获得更多的好玩JavaEE 实践 :
    使用Arthas 获取Spring ApplicationContext还原问题现场 原 荐

© 著作权归作者所有

打印

上一篇: Spring的事务传播行为

下一篇: Spring Cloud Gateway 扩展支持动态限流

使用Arthas 获取Spring ApplicationContext还原问题现场 原 荐

冷冷gg

使用Arthas 获取Spring ApplicationContext还原问题现场 原 荐
使用Arthas 获取Spring ApplicationContext还原问题现场 原 荐

初出茅庐

我们都是从 Hello World 开始的!

领取条件:技能积分大于 200,且被推荐的博客数量大于 3 篇。

粉丝 643

博文 128

码字总数 66849

作品 1

潍坊

UI设计师

提问

相关文章 最新文章

阿里巴巴Arthas实践--jad/mc/redefine线上热更新一条龙

背景 尽管在生产环境热更新代码,并不是很好的行为,很可能导致:热更不规范,同事两行泪。 但很多时候我们的确希望能热更新代码,比如: 线上排查问题,找到修复思路了,但应用重启之后,环...

横云断岭

02/19

0

0

Arthas实践--获取到Spring Context,然后为所欲为

背景 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。 https://github.com/alibaba/arthas Arthas提供了非常丰富的关于调用拦截的命令,比如 trace/watch/monitor/tt 。但是很多时候我...

阿里云云栖社区

01/31

0

0

当Dubbo遇上Arthas - 排查问题的实践

Apache Dubbo是Alibaba开源的高性能RPC框架,在国内有非常多的用户。 Github: https://github.com/apache/incubator-dubbo 文档:http://dubbo.incubator.apache.org/zh-cn/ Arthas是Alibaba......

横云断岭

2018/12/10

0

0

Arthas实践:是哪个Controller处理了请求?

背景 Arthas是阿里巴巴开源的Java诊断利器,深受开发者喜爱。 https://github.com/alibaba/arthas Arthas在线教程 之前分享了Arthas怎样排查 404/401 的问题: http://hengyunabc.github.io/a...

横云断岭

06/05

0

0

新的开始 | Arthas GitHub Star 破万后的回顾和展望

一切新的开始,都始于一个里程碑。 2月20日上午,Java 开源诊断工具 Arthas 的 GitHub Star 突破10000,距离开源后的第一个Release 版发布仅 147 天。 从中,我们不仅看到 Arthas 在开发者群...

中间件小哥

02/21

0

0

使用Arthas 获取Spring ApplicationContext还原问题现场 原 荐

没有更多内容

加载失败,请刷新页面

加载更多
使用Arthas 获取Spring ApplicationContext还原问题现场

背景 最近来了个实习僧小弟,安排他实现对目标网站 连通性检测的小功能,简单讲就是将下边的shell 脚本换成Java 代码来实现 #!/bin/bashURL="https://www.baidu"HTTP_CODE=`curl -o /dev/nu...

冷冷gg

36分钟前

27

0

使用Arthas 获取Spring ApplicationContext还原问题现场 原 荐
OSChina 周四乱弹 —— 从小到大喜欢的女孩儿嫁给别人

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :一个人看电影霸场什么体验#今日歌曲推荐# 分享keshi的单曲《just friends》: 《just friends》- keshi 手机党少年们想听歌,请使...

小小编辑

今天

2.6K

22

使用Arthas 获取Spring ApplicationContext还原问题现场 原 荐
c++ 右值引用

首先,什么是左值、右值? 左值是能出现在等号左边和右边的变量,右值是只能出现在等号右边的变量(或表达式)。 左值引用为 & , 而右值引用为 &&。 那么为什么需要右值引用呢?主要是为了处...

天王盖地虎626

昨天

16

0

【每日一学190731】cookie基础

由于cookie的使用与jsp有关联,会使用到部分jsp技术,所以先简单介绍一下jsp。 简单介绍jsp jsp的出现是为了解决Serlvet中拼接大量的html代码的问题,同时在jsp技术中可以直接书写html,js,...

guo__wei

昨天

22

0

使用Arthas 获取Spring ApplicationContext还原问题现场 原 荐
#原创分享# DDD领域建模之OOP进阶第一篇【值对象】

接着上期的内容我们继续开展谈话的内容,作为DDD构建的基石----【OOP】是其最基本的构成,计算机软件用于无限趋近的还原我们现时社会的某种活动,一切皆可建模(这样的思想不一定全对,但在一...

边缘行者

昨天

32

0

没有更多内容

加载失败,请刷新页面

加载更多
原文  https://my.oschina.net/giegie/blog/3081896
正文到此结束
Loading...