摘要:背景最近来了个实习僧小弟,安排他实现对目标网站连通性检测的小功能简单讲就是将下边的脚本换成代码来实现百度平台状态不正常,请注意功能实现使用开始执行定时任务,检测百度网站连通性请求百度成功,返回报文请求异常百度执行检测百度网站连通
背景
最近来了个实习僧小弟,安排他实现对目标网站 连通性检测的小功能,简单讲就是将下边的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命令 获取到ApplicationContextarthas 执行 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://www.ucloud.cn/yun/75911.html
摘要:背景最近来了个实习僧小弟,安排他实现对目标网站连通性检测的小功能简单讲就是将下边的脚本换成代码来实现百度平台状态不正常,请注意功能实现使用开始执行定时任务,检测百度网站连通性请求百度成功,返回报文请求异常百度执行检测百度网站连通 背景 最近来了个实习僧小弟,安排他实现对目标网站 连通性检测的小功能,简单讲就是将下边的shell 脚本换成Java 代码来实现 #!/bin/bash UR...
摘要:对于人类来说,字节码文件的可读性远远没有代码高。尽管如此,还是有一些杰出的程序员们创造出了可以用来直接编辑字节码的框架,提供接口可以让我们方便地操作字节码文件,进行注入修改类的方法,动态创造一个新的类等等操作。 引子 在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在为一件事情苦恼,程序出问题了,一时看不出问题出在哪里,于是有了以下对话: Debug一下吧。 线上机器,没开Debu...
摘要:诊断工具简介是阿里开源的一个线上诊断工具,发现阿里还是挺喜欢开源一些技术的,造福人类。昨天试用了一下,发现真是强大,解决了我工作两年的很多困扰,有点相见恨晚的感觉。每秒统计方法的调用次数,成功失败次数和平均响应时间等。具体使用请见。 Java诊断工具Arthas 1. Arthas简介 Arthas是阿里开源的一个线上java诊断工具,发现阿里还是挺喜欢开源一些技术的,造福人类。昨天试...
摘要:是什么摘自的介绍大意为是阿里开源的一个诊断工具,可以帮助开发人员在不修改代码或重启服务器的情况下快速定位线上问题。听起来确实是我们的程序员的一大福利。参考资料使用手册 1. Arthas是什么? 摘自Arthas的Github介绍: Arthas is a Java Diagnostic tool open sourced by Alibaba. Arthas allows deve...
摘要:是什么鬼是一款阿里巴巴开源的线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题。诊断使用的是命令行交互模式,支持,操作系统,命令还支持使用键对各种信息的自动补全,诊断起来非常利索。显示当前系统的实时数据面板,按即可退出。 Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题。 Arthas诊断使用的是...
阅读 884·2021-11-24 09:38
阅读 821·2021-11-23 09:51
阅读 2897·2021-11-16 11:44
阅读 1699·2021-09-22 15:52
阅读 1582·2021-09-10 11:20
阅读 1332·2019-08-30 13:47
阅读 1245·2019-08-29 12:36
阅读 3265·2019-08-26 10:43