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

【2024保研经验帖】中科院信工所夏令营经验分享 中科院信工所夏令营经验分享,信工所夏令营据说只要报了就能进,这个是不是真的尚不清楚,不过qq群里有八九百个人,也属实可怕。招生老师说我们这届夏令营招200-300个左右,于是又开始惶惶不安。 夏令营时期都是线上进行,先是每个科室进行线上招生宣讲,然后报名第一志愿部门和第二志愿部门,不同部门的考核是不同的。有的部门只要求英语面试和综合面试,有的部门除了面试还需要机试,而有的部门除了这些还需要笔试。 阅读详情

背景

最近来了个实习僧小弟,安排他实现对目标网站 连通性检测的小功能,简单讲就是将下边的shell 脚本换成Java 代码来实现

 1#!/bin/bash
 2URL="https://www.baidu"
 3HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`
 4#echo $HTTP_CODE
 5if [ $HTTP_CODE != '200' ];then
 6curl '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}

  • 任意执行一次请求获取到 RequestMappingHandlerAdaptertarget 目标,然后执行 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 应用

量化回测框架三选一:Backtrader、Zipline、PyAlgoTrade,新手到底该跟谁学? 本文对比分析了三大量化回测框架Backtrader、Zipline和PyAlgoTrade,帮助新手选择最适合的入门工具。从安装配置、策略编写到文档查阅,详细解析各框架的特点和适用场景,为量化交易初学者提供实用指南。 阅读详情

相关推荐

PCB板质量测试和PCB板

PCB板质量测试和板厂

weixin_51370842的博客 516

Spring MVC+Junit测试出错: WebApplicationObjectSupport instance [ResourceHttpRequestHandler [locations=[c

问题描述:对Spring MVC项目中的Service层使用JUnit进行测试时出现错误 WebApplicationObjectSupport instance                  [ResourceHttpRequestHandler [locations=[class path resource []], resolvers=                [org.sprin...

lqinggang的博客 6094

伪傻瓜式安装sql server2008【附带安装包】

安装各式各样的软件无疑是学习过程中…较…为烦躁的一部分 木有醋 但还是开始吧 为什么这是伪呢? 因为刚开始天真无邪的我真的是傻瓜式安装(迷之自信),结果就B了(打开配置管理器的瞬间….一片空白) BaiduCloud分享 红领巾在何方?? Link链接:https://pan.baidu.com/s/1NZCxP0Y27dBPrgHoRWLDyQ...

EuniBoom的博客 6万+

java.lang.IllegalStateException: WebApplicationObjectSupport instance [ResourceHttpRequestHandler异常

检查是否缺少这个注解就好啦。

weixin_56527214的博客 248

局放起始电压(PDIV)与击穿电压(BDV):绝缘系统设计的核心参数 [特殊字符]

在电力设备绝缘系统设计中,**局放起始电压(Partial Discharge Inception Voltage, PDIV)和击穿电压(Breakdown Voltage, BDV)**是两个至关重要的参数。它们直接反映了绝缘材料的性能和绝缘系统的可靠性,对变压器的设计、制造和运行具有重要指导意义。本文将深入探讨这两项参数的定义、测试方法及其与绝缘设计制造的关系,帮助读者全面理解其在电力设备中的核心作用。

mubiao05的博客 2639

提示词工程的几个参数

低 temperature + 低 top-p:输出最稳定、最可靠,适合需要准确性和一致性的场景。高 temperature + 高 top-p:输出最多样化、最富有创意,适合需要灵感和探索的场景。Max Length:您可以通过调整max length来控制大模型生成的 token 数。指定 Max Length 有助于防止大模型生成冗长或不相关的响应并控制成本。是一个字符串,可以阻止模型生成 token,指定是控制大模型响应长度和结构的另一种方法。例如,您可以通过添加 “11” 作为。

weixin_44212787的博客 1829

java.lang.IllegalStateException: WebApplicationObjectSupport instance

单纯的记录一个用junit4测试的错误。tomcat8+ss(4)m(3)+maven+eclipse.在测试mapper接口时报错 java.lang.IllegalStateException: WebApplicationObjectSupport instance [ResourceHttpRequestHandler [locations=[class path resource

正在减肥的java小菜鸟 4874

从零构建:ESP32S3无线DAP-Link调试器的硬件与软件协同设计

本文详细介绍了基于ESP32S3的无线DAP-Link调试器的硬件与软件协同设计,涵盖关键元器件选型、无线通信协议优化、双核任务处理及低功耗调试方案。通过ESP-NOW协议实现低延迟无线调试,结合USB协议栈与双核协同,为嵌入式开发提供高效灵活的调试解决方案。

gitlab7runner的博客 860

SpringBoot源码简读——3.3 run方法-ApplicationContext初始化

在SpringApplication中的逻辑 // org/springframework/boot/SpringApplication.java // 进一步初始化容器 prepareContext(context, environment, listeners, applicationArguments,printedBanner); // 刷新容器 refr...

大风的博客 1364

abaqus2matlab的安装与使用:如何用matlab提取abaqus的odb结果

官网abaqus2matlab官网地址matlab社区地址matlab社区地址在这里可以看到.m文件的源码论文:Abaqus2Matlab: A suitable tool for finite element post-processingabaqus2matlab可以处理.inp、.fil、.odb三种类型的文件。.inp文件:处理功能就在于只是单纯的输出inp文件,由于我自己写了自己的函数,不需要用到这个功能。

qianxin1234的博客 2019

【Prometheus】prometheus结合cAdvisor监控docker容器运行状态,并且实现实时告警通知

Docker的监控,可以使用Docker自带的stats命令来获取当前主机上运行中的容器的资源使用情况。 例如:容器的CPU使用率、内存占用、网络IO以及磁盘IO等指标。

景天科技苑 6万+

java amp 0xff6_使用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 !...

weixin_34835470的博客 193

量子化学仿真软件:VASP_(9).磁性材料计算

在量子化学仿真软件 VASP 中,磁性材料的计算是一个复杂但重要的过程。通过正确设置磁性状态、分析磁性性质、优化计算参数以及研究磁性相变和磁动力学,可以更准确地描述和预测磁性材料的性能。希望本节的内容能够为研究磁性材料的科研人员提供有用的参考和指导。

kkchenjj的博客 1377

ApplicationContext获取对象时注解丢失问题及 Arthas 验证方法

本文探讨了通过Spring ApplicationContext获取对象时无法获取注解的问题,分析了原因并展示了如何使用Arthas验证代理类上没有注解的解决方案。

花伤情犹在的博客 949

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Arthas工具使用-1,使用Arthas 查看spring bean的值

因为可能存在很多个类加载器,每个classloader都有可能加载spring的ApplicationContext类,所以需要确定具体是哪个类加载器,找到其hashcode。代码中写的是:defaultCaffeineCacheOperator. getAllkeys(),此处不能使用“()”第二步:查看bean信息,本例中 bean名称:defaultCaffeineCacheOperator。第三步:调用bean的方法。

Num1521321770的博客 1099

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

arthas获取spring bean

直接找到需要判断的class,用jad反编译看看结果最简单了啊。

李习的博客 952

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

背景Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。https://github.com/alibaba/arthasArthas提供了非常丰富的关...

技术原始积累 1498

java怎么看程序成员变量_基于Spring 使用Arthas查看成员变量值

如何使用arthas查看成员变量搜了一下官方文档没找到合适方法直接查看对象的成员变量,发现一位朋友有这样一个办法,一般我们用Spring时,可以写一个Holder类,实现ApplicationContextWare接口,这样我们在Spring加载后可以获取其context变量,context.getBean可以通过类名获取对象。所以基于这个想法,可以这样写,完整示例如下:1、定义Holder类im...

weixin_42234804的博客 2090

Alibaba Arthas实践--获取到Spring Context为所欲为

Alibaba Arthas实践--获取到Spring Context为所欲为

qq_39158441的博客 917
上一篇: SpringBoot Kafka 整合使用
下一篇: 如何优雅关闭 Spring Boot 应用
SpringForAll
博客等级 码龄7年 15粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值