使用Arthas 获取Spring ApplicationContext还原问题现场
背景
最近来了个实习僧小弟,安排他实现对目标网站 连通性检测的小功能,简单讲就是将下边的shell 脚本换成Java 代码来实现
1#!/bin/bash2URL="https://www.baidu"3HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`4#echo $HTTP_CODE5if [ $HTTP_CODE != '200' ];then6curl 'https://oapi.dingtalk.com/robot/send?access_token=xx' \7 -H 'Content-Type: application/json' \8 -d '{"msgtype": "text",9 "text": {
10 "content": "百度平台状态不正常,请注意!"
11 },
12 "isAtAll": true
13 }'
14
15fi复制代码
功能实现
使用spring task
1@Scheduled(cron = "0 0 0/1 * * ? ")2public void startSchedule() {3 log.info("开始执行定时任务 ,检测百度网站连通性");4 try {5 HttpResponse response = HttpRequest.get("").execute();6 if (HttpStatus.HTTP_OK != response.getStatus()) {7 this.send2DingTalk(response.getStatus());8 }9 log.info("请求百度成功,返回报文:{}",response.body());
10 } catch (HttpException e) {
11 log.error("请求异常百度:{}", e);
12 this.send2DingTalk(e.getMessage());
13 }
14 log.info("执行检测百度网站连通任务完毕");
15}复制代码
问题描述
部署在服务器上,我的老jio本 都已经呼叫任务状态不正常了,可是小弟的Java 代码还是没有执行通知
- 去翻生产日志,只输入了开始并没有输出定时任务结束,感觉是哪里卡死,想当然以为如果超时总会到catch 逻辑,排查无果
- 由于任务是一小时一次,如何快速触发一下这个异常,还原事故现场
- 由于使用简单的Spring Task 没有图形化界面和API接口
Arthas 还原事故现场,重新触发任务
核心拿到 spring context 然后执行它的 startSchedule
方法
确定监控点
- SpringMVC 的请求会通过
RequestMappingHandlerAdapter
执行invokeHandlerMethod
到达目标接口上进行处理 - 而在
RequestMappingHandlerAdapter
类中有 getApplicationContext()
1@Nullable
2public final ApplicationContext getApplicationContext() throws IllegalStateException {
3 if (this.applicationContext == null && this.isContextRequired()) {
4 throw new IllegalStateException("ApplicationObjectSupport instance [" + this + "] does not run in an ApplicationContext");
5 } else {
6 return this.applicationContext;
7 }
8}复制代码
- 任意执行一次请求获取到
RequestMappingHandlerAdapter
target 目标,然后执行getApplicationContext
tt命令 获取到ApplicationContext
- arthas 执行 tt
1tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod复制代码
- 任意执行一次web 请求,tt 即可捕获
- 根据目标的索引,执行自定义 OGNL 表达式即可
1tt -i 1019 -w 'target.getApplicationContext()'复制代码
使用ApplicationContext获取 定时任务bean 执行 startSchedule
1tt -i 1000 -w 'target.getApplicationContext().getBean("baiduSchedule").startSchedule()'复制代码
ok 任务重新触发了
事故原因调查清楚,由于使用hutool 的工具类 没有设置timeout 导致无限等待,所以没有执行catch 逻辑
总结
以上吓哭实习僧的操作禁止
生产操作,只是提供个思路 ,当然可以衍生其他业务场景的操作
核心是通过Arthas 来抓取Spring ApplicationContext 对象,然后获取bean 进行执行方法
关于Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱
欢迎关注我们获得更多的好玩JavaEE 实践
推荐阅读:
《深入理解 Java 内存模型》读书笔记
面试-基础篇
Spring Boot 2.0 迁移指南
SpringBoot使用Docker快速部署项目
为什么选择 Spring 作为 Java 框架?
SpringBoot RocketMQ 整合使用和监控
Spring Boot 面试的十个问题
使用 Spring Framework 时常犯的十大错误
SpringBoot Kafka 整合使用
SpringBoot RabbitMQ 整合使用
上篇好文:
如何优雅关闭 Spring Boot 应用
转载于:https://juejin.im/post/5d498a1af265da03e921b262
使用Arthas 获取Spring ApplicationContext还原问题现场相关推荐
- spring获取webapplicationcontext,applicationcontext几种方法详解(转载)
转载自 http://www.blogjava.net/Todd/archive/2010/04/22/295112.html 方法一:在初始化时保存ApplicationContext对象 代码: ...
- 使用 spring 的 IOC 解决程序耦合——获取spring的Ioc核心容器,并根据id获取对象、核心容器的两个接口(ApplicationContext、BeanFactory)引发出的问题
IOC概念和spring中的IOC 明确 ioc 的作用: 削减计算机程序的耦合(解除我们代码中的依赖关系). 使用 spring 的 IOC 解决程序耦合 获取spring的Ioc核心容器,并根据i ...
- 获取Spring的ApplicationContext的几种方式
转载自 获取Spring的ApplicationContext的几种方式 Application Context定义 简单来说就是Spring中的高级容器,可以获取容器中的各种bean组件,注册监听事 ...
- spring获取webapplicationcontext,applicationcontext几
2019独角兽企业重金招聘Python工程师标准>>> 方法一:在初始化时保存ApplicationContext对象 代码: ApplicationContext ac = new ...
- springboot实战 获取spring上下文的4种方式
实际开发中我们经常需要通过spring上下文获取一些配置信息,本文阐述springboot应用获取spring上下文的几种方式. 方式一:实现ApplicationContextAware接口 imp ...
- 怎么随时获取Spring的上下文ApplicaitonContext,和Spring管理的Bean
BeanFactory接口 Interface BeanFactory getBean <T> T getBean(String name,Class<T> requiredT ...
- 【SpringBoot】在普通类中获取spring容器中的bean
这段时间公司搞封闭开发,做一个联通总部的客服系统项目,是基于springboot的.在开发工程中遇到一个页面datagrid数据排序的功能,因为有多个表的数据都要用到排序功能,于是我就写了一个排序功能 ...
- java 获取spring对象数组_解析Java中如何获取Spring中配置的bean
解析Java中如何获取Spring中配置的bean Java中如何获取Spring中配置的bean?下面是由百分网小编为大家整理的解析Java中如何获取Spring中配置的bean,喜欢的可以收藏一下 ...
- 工具类:获取 spring 容器中 bean
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. package com.orange.utils;import org.springframewor ...
最新文章
- 编写c语言程序 斐波那契,C语言程序实现斐波那契数列的解题思路???
- 揭秘仿人机器人背后的技术秘密 | 优必选研究院技术专家刘益彰【附PPT】
- Razor Engine,动态脚本语言,mvc上的语法,适用于文件内容生成,静态网页生成等。...
- 藁城一中2021年高考成绩查询,2017藁城一中录取分数线及高考成绩情况
- springboot actuator监控笔记
- Linux系统中源码包tomcat的管理
- 区块链的爆发仍为时尚早......
- c语言中数据类型的课件,C语言数据类型课件.ppt
- jQuery,Table表头固定插件chromatable存在的问题及解决办法
- WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)
- 双态运维联盟首个“共研基地”落户云南电网信息中心
- 强大的Windows 10数字权利获取工具HWIDGEN
- android正反面切换,普通安卓手机数据线可以正反插吗?你一定猜错了
- SpringBoot 统一功能处理
- 前端涨薪必读,node.js入门保姆级教程
- html5播放加速,html5倍速播放插件
- 打印时的纸张大小尺寸
- 二,区块链理论(定义及特性)
- PowerPC MMU机制读书笔记
- 长江钢琴质量具有哪些优势